Publicado el Dejar un comentario

Dónde guarda el código MyBusiness POS?

Tal vez te has preguntado cómo es que almacena las modificaciones el sistema MyBusiness POS. Los scripts se almacenan e dos tablas:

  • FormasDeltaEsta tabla almacena todos los códigos que utiliza el sistema para la mayoría de las ventanas que utilizamos y podemos modificar con el editor gráfico
  • FormatosDeltaEsta tabla almacena los procedimientos, formatos de impresión y formatos de reportes que tiene el sistema

Cabe destacar que no todo el código es visible por el usuario; aproximadamente un 30% es código duro que no de puede editar. Sin embargo, el código visible es suficiente para crear nuevos desarrollos a la medida.

Espero que esta informaicón sea de utilidad para futuros desarrolladores de módulos.   

Publicado el 3 comentarios

Antes de aceptar un código lo dividimos en partes

Código que se ejecuta al presionar la Tecla F2 en el punto de Venta

Sub Main()

If LCase(Articulo) = "_ini" Then
Script.RunProcess "GREENBOXINI", Me, Ambiente
CancelaProceso = True
Exit Sub
End If

If LCase(Articulo) = "_setup" Then
Script.RunProcess "GREENBOXALTA", Me, Ambiente
CancelaProceso = True
Exit Sub
End If

If LCase(Articulo) = "_tellerscatalog" Then
Script.RunProcess "GREENBOXCAJEROS", Me, Ambiente
CancelaProceso = True
Exit Sub
End If

If LCase(Articulo) = "_ta" Then
Script.RunProcess "GREENBOXTIEMPOAIRE", Me, Ambiente
CancelaProceso = True
Exit Sub
End If

If LCase(Articulo) = "_tv" Then
Script.RunProcess "GREENBOXVERIFICAR", Me, Ambiente
CancelaProceso = True
Exit Sub
End If

If Articulo = "CONSULTA EXISTENCIA" Then
Script.RunForm "CC05", Me, Ambiente,, True
CancelaProceso = True
Exit Sub
End If

'Set rstArt = CreaRecordSet( "SELECT peso FROM prods WHERE articulo = '" & Articulo & "'", Ambiente.Connection )

'If Not rstArt.EOF Then
' Me.Descuento = rstArt("peso")
'End If

'Call incrementaProducto()

' Articulo es una variable que entrega el dato que se capturo en
' el punto de venta
If Trim( Ucase(Articulo) ) = "ADMISION" Then

If Me.Venta = 0 Then
MyMessage "Es necesario capturar al menos de un producto"
CancelaProceso = True
Exit Sub
End If

Script.RunForm "MIFORMA", Me, Ambiente, , True
'PlaySound Ambiente.Path & "\sounds\s03.wav"
CancelaProceso = True
End If

Me.usuarioRequerido = 0

If clAt( "VPZ", Articulo ) = 1 Then
Call recuperaVenta()
CancelaProceso = True
End If

If Ucase(Trim(Articulo)) = "EXR" Then
CancelaProceso = True
Script.RunForm "EXISTENCIAREMOTA", Me, Ambiente,, True
End If

Version2005

'Call calculaPrecioDecaja()

End Sub

Sub calculaPrecioDeCaja()
Dim rstClaveAdd
Dim rstArticulo

Set rstClaveAdd = CreaRecordSet( "SELECT articulo, cantidad FROM clavesadd WHERE clave = '" & Me.Articulo & "'", Ambiente.Connection )

If rstClaveAdd.EOF Then
Exit Sub
End If

If rstClaveAdd("cantidad") = 1 Then
Exit Sub
End If

Set rstArticulo = CreaRecordSet( "SELECT precio3 FROM prods WHERE articulo = '" & Trim(rstClaveAdd("articulo")) & "'", Ambiente.Connection )

If Not rstArticulo.EOF Then
Me.PrecioEspecial = rstArticulo("precio3")
End If

End Sub

Sub recuperaVenta()
Dim rstVenta, nVenta

nVenta = Val2( Mid( Articulo, 4 ) )

Set rstVenta = CreaRecordSet( _
"SELECT * FROM ventas WHERE venta = " & nVenta, _
Ambiente.Connection )

If rstVenta.EOF Then
' El campo 3 despliega los mensajes en el punto de venta
txtFields(3) = "Venta no encontrada"
Exit Sub
End If

If rstVenta("estado") <> "PE" Then
txtFields(3) = "Venta no valida"
Exit Sub
End If

Set Me.rstVenta = rstVenta
Set Me.rstPartidas = CreaRecordSet( _
"SELECT * FROM partvta WHERE venta = " & nVenta, _
Ambiente.Connection )
Me.Venta = nVenta
Me.Modo = "MODIFICACION"
Me.Reload = True
Me.ReiniciaVenta
Eventos
Me.CalculaImportes
End Sub

Sub Version2005
Dim rstEmpleado
Dim cEmpleado
Dim Query
Dim nPos
Dim cCodigo
Dim cPeso
Dim rstAsistencia
Dim Contenido

' Articulo es una variable que entrega el punto de venta
' Esto proceso todos los comandos del punto de venta
Call ValidaComando

'validaNumeroDePartidas

If UCase(Trim(Articulo)) = "CENEFASXMARCA" Then
Script.RunForm "CENEFASXMARCA", Me, Ambiente,, True
CancelaProceso = True
End If

If UCase(Trim(Articulo)) = "CENEFAS" Then
Script.RunForm "CENEFAS", Me, Ambiente,, True
CancelaProceso = True
End If

If Ucase(Trim(Articulo)) = "BORDADO" Then
Script.RunForm "BORDADO", Me, Ambiente,, True
End If

If Ucase(Trim(Articulo)) = "LONAS" Then
Script.RunForm "LONAS", Me, Ambiente,, True
End If

If Ucase(Trim(Articulo)) = "ESTAMPADO01" Then
Script.RunForm "ESTAMPADO", Me, Ambiente,, True
End If

If Ucase(Trim(Articulo)) = "ESTAMPADO02" Then
Script.RunForm "ESTAMPADO02", Me, Ambiente,, True
End If

If Ucase(Trim(Articulo)) = "ESTAMPADO03" Then
Script.RunForm "ESTAMPADO03", Me, Ambiente,, True
End If

'SumaCantidades
' Articulo es una variable publica que contiene el dato que leyo el lector
' o que tecleo el usuario hasta el momento de presionar un enter
nPos = clAt( "*", Articulo )

' cantidadDeArticulos es una variable publica que indica la cantidad
' de productos que va a aceptar el punto de venta
If nPos > 0 Then
cantidadDeArticulos = Val2( Mid( Articulo, 1, nPos - 1 ) )
Articulo = Mid( Articulo, nPos + 1 )
End If

' Para articulos con peso
If clAt( "ARTICULOPARAPESO", Articulo ) = 1 Then
cCodigo = Mid( Articulo, 3, 5 )
cPeso = Mid( Articulo, 8 )
Articulo = cCodigo
CantidadDeArticulos = (Val2(cPeso) / 10000)
End if

nPos = clAt( "CLI", Articulo )

' La varable cancelaProceso termina el flujo de programa interno de MyBusiness
' Parecido a Exit Sub
If nPos = 1 Then
txtFields(0) = Mid( Articulo, 4 )
txtFields(4) = ""
CancelaProceso = True
ChecaSaldo txtFields(0)
ColocaFoto txtFields(0)
End If

If clAt( "EMP", Articulo ) = 1 Then
cEmpleado = UCase(Mid( Articulo, 4 ))
Set rstEmpleado = CreaRecordSet( "SELECT * FROM empleados WHERE empleado = '" & cEmpleado & "'", Ambiente.Connection )

If rstEmpleado.EOF Then
txtFields(3) = "Empleado no existe"
cancelaProceso = True
txtFields(4) = ""
PlaySound Ambiente.Path & "\sounds\error.wav"
Exit Sub
End If

'Set rstEmpFecha = CreaRecordSet( "SELECT * FROM asistencia WHERE empleado = '" & cEmpleado & "' AND fecha = " & fechaSQL( Date, Ambiente.Connection ), Ambiente.Connection )

'If Not rstEmpFecha.EOF Then
' txtFields(3) = "Usted ya fue registrado"
' cancelaProceso = True
' txtFields(4) = ""
' PlaySound Ambiente.Path & "\sounds\error.wav"
' Exit Sub
'End If

'PlaySound Ambiente.Path & "\sounds\ready.wav"

Set Query = NewQuery()
Set Query.Connection = Ambiente.Connection

Query.strState = "INSERT"

Query.AddField "asistencia", "id", TraeSiguiente( "asistencia", Ambiente.Connection )
Query.AddField "asistencia", "fechahora", Formato( Date, "dd-MM-yyyy" ) & ":" & Formato( Time, "hh:mm:ss" )
Query.AddField "asistencia", "retardo", Retardo( rstEmpleado("horaentrada") )
Query.AddField "asistencia", "empleado", cEmpleado
Query.AddField "asistencia", "fecha", Date
Query.CreateQuery
Query.Execute

txtFields(3) = rstEmpleado("nombre") & " " & Formato( Date, "dd-MM-yyyy" ) & ":" & Formato( Time, "hh:mm:ss" )
CancelaProceso = True
txtFields(4) = ""

If Not clEmpty( rstEmpleado("imagen") ) Then
CreaHTML "", ""
End If

End If

If Ucase(Trim(Articulo)) = "ARTICULOS PROMOCIONALES" Then
Script.RunProcess "GALAXIA", Me.Parent, Ambiente
CancelaProceso = True
txtFields(4) = ""
End If

If Mid(UCase(Trim(Articulo)),1,6) = "MONEDA" Then
cambiaMonedaDeLaVenta Trim(Mid( Articulo, 7 ))
cancelaProceso = True
End If
'Call ValidaExistencia()
End Sub

Sub ValidaExistencia()
Dim rstProd
Set rstProd = CreaRecordSet( "SELECT alm" & Ambiente.Almacen & " FROM prods WHERE articulo = '" & articulo & "'", _
Ambiente.Connection )

If Not rstProd.EOF Then
If rstProd(0) <= 0 Then Me.OperacionBloqueada = True txtFields(3) = "Existencia insuficiente, operación bloqueada" CancelaProceso = True PlaySound Ambiente.Path & "\sounds\Existencia.wav" End If End If End Sub Sub cambiaMonedaDeLaVenta( cMoneda ) Dim rstVenta, rstMoneda, Query, rstMonedaOriginal Set rstVenta = CreaRecordSet( _ "SELECT * FROM ventas WHERE venta = " & Me.Venta, Ambiente.Connection ) Set rstMoneda = CreaRecordSet( _ "SELECT * FROM monedas WHERE moneda = '" & cMoneda & "'", Ambiente.Connection ) If Not rstMoneda.EOF Then Me.Moneda = cMoneda Me.tipoDeCambio = rstMoneda("tc") Else Exit Sub End If If rstVenta.EOF Then Exit Sub End If If Ucase(Trim(rstVenta("moneda"))) = UCase(Trim(cMoneda)) Then Exit Sub End If Ambiente.Connection.Execute _ "UPDATE partvta SET precio = precio * " & FormatoDecimal( rstVenta("tipo_cam") ) & ", " & _ "preciobase = preciobase * " & FormatoDecimal( rstVenta("tipo_cam") ) & ", " & _ "donativo = donativo * " & FormatoDecimal( rstVenta("tipo_cam") ) & " " & _ "WHERE venta = " & Me.Venta Ambiente.Connection.Execute _ "UPDATE partvta SET precio = precio / " & FormatoDecimal( Me.tipoDeCambio ) & ", " & _ "preciobase = preciobase / " & FormatoDecimal( Me.tipoDeCambio ) & ", " & _ "donativo = donativo / " & FormatoDecimal( Me.tipoDeCambio ) & " " & _ "WHERE venta = " & Me.Venta Set Query = NewQuery() Set Query.Connection = Ambiente.Connection Query.Reset Query.strState = "UPDATE" Query.Condition = "venta = " & Me.Venta Query.AddField "ventas", "moneda", Me.Moneda Query.AddField "ventas", "tipo_cam", Me.tipoDeCambio Query.CreateQuery Query.Execute Parent.ReLoad = True ReiniciaVenta CalculaImportes End Sub Sub ChecaSaldo( Cliente ) Dim rstSaldo, rstCobranza, Html Set rstSaldo = CreaRecordSet( "SELECT * FROM clients WHERE cliente = '" & Cliente & "'", _ Ambiente.Connection ) If rstSaldo.EOF Then Exit Sub End If CreaHTML "","" If rstSaldo("Saldo") <= 0 Then Exit Sub End If PlaySound "c:\saldo.wav" Set rstCobranza = CreaRecordSet( _ "SELECT * FROM cobranza WHERE cliente = '" & cliente & "' AND saldo > 0", _
Ambiente.Connection )

html = ""

While Not rstCobranza.EOF
html = html & "

"
html = html & "Documento " & rstCobranza("tipo_doc") & _
rstCobranza("no_referen") & " " & rstCobranza("Saldo")
html = html & "

"
rstCobranza.MoveNext
Wend

CreaHTML "",(Html)

End Sub

Function Retardo( strHora )
Dim intMinutos
Dim intMinutosActual
Dim nPos
Dim strHoraActual
Dim tolerancia

tolerancia = 10

nPos = clAt( ":", strHora )
intMinutos = Val2( Mid( strHora, 1, nPos - 1) ) * 60
intMinutos = intMinutos + Val2( Mid( strHora, nPos + 1 ) )

strHoraActual = Formato( Time(), "hh:mm" )
nPos = clAt( ":", strHoraActual )
intMinutosActual = Val2( Mid( strHoraActual, 1, nPos - 1) ) * 60
intMinutosActual = intMinutosActual + Val2( Mid( strHoraActual, nPos + 1 ) )

If intMinutosActual > (intMinutos + tolerancia) Then
Retardo = intMinutosActual - intMinutos
Else
Retardo = 0
End If

End Function

Sub ColocaFoto( cCliente )
Dim cHtml

cHtml = ""
CreaHTML "", (cHtml)

End Sub

Sub SumaCantidades()

' Buscamos si el artículo ya esta en el GRID
For n = 1 to fg2.Rows - 1
If clEmpty( fg2.TextMatrix( n, 0 ) ) Then
Exit For
End If

Set rstArtAux = Rst("SELECT tiempoaire FROM prods WHERE articulo = '" & Trim(Articulo) & "'", Ambiente.Connection)

If Trim(fg2.TextMatrix( n, 0 )) = Trim(Articulo) AND Val2(rstArtAux("tiempoaire")) <> 0 Then
Ambiente.Connection.Execute "UPDATE partvta SET cantidad = cantidad + 1 WHERE id_salida = " & fg2.TextMatrix( n, 7 )
fg2.TextMatrix( n, 1 ) = Val2( fg2.TextMatrix( n, 1 ) ) + 1
txtFields(4) = ""
CancelaProceso = True
Exit Sub
End If
Next

End Sub

Sub validaNumeroDePartidas
Dim rstPartidas

Set rstPartidas = CreaRecordSet( _
"SELECT COUNT( * ) FROM partvta WHERE venta = " & Me.Venta, _
Ambiente.Connection )

If Val2( rstPartidas(0) ) >= 4 Then
MyMessage "No es posible capturar mas de 4 partidas"
CancelaProceso = True
End If

End Sub

Sub ValidaComando()

If clAt( "/", Articulo ) > 0 And clAt( "//", Articulo ) = 0 Then
Call cantidaporPrecio()
Exit Sub
End If

If Trim(UCase(Articulo)) = "COMPRAS" Then
Set Compras = CreateObject( "MyBCompras.Compras" )
Set Compras.Ambiente = Ambiente
Compras.NuevaCompra True
End If

If Len( Trim( Articulo ) ) <> 4 Then
Exit Sub
End If

If clAt( "Z", UCase(Articulo) ) <> 1 Then
Exit Sub
End If

Select Case UCase(Articulo)
Case "Z001"
Script.RunForm "ALTACLIENTE", Me, Ambiente,, True
Case "Z002"
Me.OperacionBloqueada = False
txtFields(3) = "Operación Reactivada"
Case "Z003"
Me.FinalizaOperacion
Case "Z004"
Script.RunForm "ALTARAPIDA", Me, Ambiente,, True
Case "Z005"

If Question(Mensaje(642, Ambiente)) Then
Me.BorraVenta = True
Me.FinalizaOperacion
End If

Case "Z006"

Me.RecuperaVentaDeCliente

Case "Z007"

If txtFields(0).Enabled Then
txtFields(0).SetFocus
End If

Case "Z008"

AplicaDescuento

Case "Z009"

Script.RunProcess "CORTEX", Me, Ambiente

Case "Z010"

Script.RunProcess "CORTEZ", Me, Ambiente

Case "Z011"

Script.RunForm "PAGOEFECTIVO", Me, Ambiente,, True

Case "Z012"

Script.RunForm "COBROENEFECTIVO", Me, Ambiente,, True

Case "Z013"

Set rstUsuventas = CreaRecordSet( "SELECT * FROM usuventas WHERE usuario = '" & Ambiente.Uid & "'", Ambiente.Connection )

If rstUsuventas.EOF Then
Script.RunForm "DEVOLUCIONES", Me, Ambiente, True
'Exit Sub
End If

If Val2( rstUsuventas("devpunto") ) <> 0 Then
Script.RunForm "DEVOLUCIONES", Me, Ambiente, True
'Exit Sub
Else
MyMessage "No tiene derecho a hacer devoluciones, solicite el permiso con su supervisor"
'Exit Sub
End If

Case "Z014"

Script.RunForm "TICKETAFACTURA", Me, Ambiente,, True

'Case "Z016"
'
' Me.ActivaCobranza

Case "Z015"

Script.RunProcess "PUNTOV063", Me, Me.Ambiente

Case "Z016"

Script.RunForm "RETICKET", Me, Ambiente,, True

'Case "Z019"
'
' MyMessage "CONTROL + F12 Editar datos cliente" & vbCrLf & "CONTROL + F7 Editar guión" & vbCrLf & "SHIFT + F3 Colocar cursor en campo repartidor" & vbCrLf & "SHIFT + F4 Alta de repartidor"

Case "Z017"

Script.RunForm "FCAJA", Me, Ambiente,, True

Case "Z018"

Script.RunForm "CAMBIOUSUARIO", Me, Ambiente,, True

'Case "Z022"
'
' Script.RunProcess "VENTASCOLECTOR", Me, Me.Ambiente

Case "Z019"

Calculadora Ambiente

Case "Z020"

Script.RunProcess "ABRECAJON", Me, Me.Ambiente

Case "Z021"

Script.RunForm "AUXCLIENTS", Parent, Ambiente,, True

Case "Z022"

Script.RunProcess "ELIMINAVENTA", Me, Me.Ambiente

Case "Z023"

Script.RunForm "VENTASOBSERV", Me, Ambiente,, True

Case "Z024"

Script.RunForm "VENTASDESC", Me, Ambiente,, True

Case "Z025"

Script.RunForm "CAMBIOVALEEFECTIVO", Me, Me.Ambiente,, True

Case "Z026"

Script.Runform "FACTURADECIERRE", Me, Ambiente,, False

Case "Z027"

Script.RunHuellaForm "REGISTROACCESO", Me, Ambiente,, True

'Case "Z028"

'Script.Runform "LISTADEPEDIDOS", Me, Ambiente,, True

End Select

CancelaProceso = True
txtFields(4) = ""

End Sub

Sub llenaPuntoDeVenta
Dim cLinea, dondeEstaLaComa, articulo

' CloseFile cierra un manejador de archivo
CloseFile 1
' OpenFile Abre un archivo de texto para lectura
OpenFile "c:\articulos.txt", 1

' FileEOF regresa true en caso de que el archivo
' de texto llegue a su final
While Not FileEOF( 1 )
' ReadLine lee una cadena de texto
' hasta que encuentra un retorno de carro
cLinea = ReadLine( 1 )
dondeEstaLaComa = clAt( ",", (cLinea) )
articulo = Mid(cLinea, 1, dondeEstaLaComa -1 )

' cantidadDeArticulos es una variable que
' entrega el punto de venta e indica la
' cantidad de productos que se va a ingresar
' en el punto de venta
cantidadDeArticulos = _
Mid( cLinea, dondeEstaLaComa + 1 )

' llenaPartidad Es un metodo que ingresa
' producto en el punto de venta
llenaPartida (articulo)
Wend

CloseFile 1

End Sub

Sub calculaPeso()
Dim rstArticulo, cArticulo, nPesos

nPos = clAt( "--", Articulo )
cArticulo = Mid( Articulo, nPos + 2 )
nPesos = Val2(Mid( Articulo, 1, nPos - 1 ))

Set rstArticulo = CreaRecordSet( _
"SELECT * FROM prods WHERE articulo = '" & cArticulo & "'", _
Ambiente.Connection )

If Not rstArticulo.EOF Then
Articulo = cArticulo
cantidadDeArticulos = nPesos / rstArticulo("precio1")
End If

End Sub

Function Permisos( permisoSolicitado )

Set rstUsuario = CreaRecordSet( _
"SELECT * FROM usuarios WHERE usuario = '" & Ambiente.uid & "'", Ambiente.connection )

If rstUsuario("supervisor") Then
cmdZ001.Caption = "Z001 Cambia o da de alta un cliente"
cmdZ002.Caption = "Z002 Quita bloqueo por error código de producto"
cmdZ003.Caption = "Z003 Confirma la venta o muestra ventana de cobro"
cmdZ004.Caption = "Z004 Da de alta o modifica un artículo"
cmdZ005.Caption = "Z005 Deja como pendiente la venta actual"
cmdZ006.Caption = "Z006 Muestra lista de ventas pendientes"
cmdZ007.Caption = "Z007 Posicionar el cursor en el campo de cliente"
cmdZ008.Caption = "Z008 Pantalla de descuentos"
cmdZ009.Caption = "Z009 Corte parcial X"
cmdZ010.Caption = "Z010 Corte total Z"
cmdZ011.Caption = "Z011 Permite capturar un ingreso de dinero a caja"
cmdZ012.Caption = "Z012 Permite capturar una salida de dinero a caja"
cmdZ013.Caption = "Z013 Realiza una devolución de mercancia en caja"
cmdZ014.Caption = "Z014 Convierte un ticket en factura"
cmdZ015.Caption = "Z015 Realiza el pago de la devolucion"
cmdZ016.Caption = "Z016 Cobranza a clientes"
cmdZ017.Caption = "Z017 Muestra información del próducto"
cmdZ018.Caption = "Z018 Re imprimir ticket"
cmdZ019.Caption = "Z019 Functiones ventas por teléfono (Informativo)"
cmdZ020.Caption = "Z020 Arqueo de efectivo"
cmdZ021.Caption = "Z021 Cambio de usuario"
cmdZ022.Caption = "Z022 Recupera ventas del colector"
cmdZ023.Caption = "Z023 Muestra la calculadora"
cmdZ024.Caption = "Z024 Abre el cajón de dinero"
cmdZ025.Caption = "Z025 Datos auxiliares del cliente"
cmdZ026.Caption = "Z026 Elimina la ultima venta"
cmdZ027.Caption = "Z027 Observaciones a la venta"
cmdZ028.Caption = "Z028 Descuento por importe"
Else
cmdZ001.Caption = "Z001 Cambia o da de alta un cliente"
cmdZ002.Caption = "Z002 Quita bloqueo por error código de producto"
cmdZ003.Caption = "Z003 Confirma la venta o muestra ventana de cobro"
cmdZ004.Caption = "Z005 Deja como pendiente la venta actual"
cmdZ005.Caption = "Z006 Muestra lista de ventas pendientes"
cmdZ006.Caption = "Z007 Posicionar el cursor en el campo de cliente"
cmdZ007.Caption = "Z011 Permite capturar un ingreso de dinero a caja"
cmdZ008.Caption = "Z012 Permite capturar una salida de dinero a caja"
cmdZ009.Caption = "Z015 Realiza el pago de la devolucion"
cmdZ010.Caption = "Z020 Arqueo de efectivo"
cmdZ011.Caption = "Z021 Cambio de usuario"
cmdZ012.Caption = "Z024 Abre el cajón de dinero"
cmdZ013.Caption = "Z025 Muestra la calculadora"
cmdZ014.Caption = "Z026 Elimina la ultima venta"
cmdZ015.Caption = "Z027 Observaciones a la venta"
cmdZ016.Caption = "Z028 Descuento por importe"
End If
End Function

Sub cantidaporPrecio()
Dim nPos, cCantidad, cArticulo, rstProd
Dim nPrecio

nPos = clAt( "/", Articulo )
cCantidad = Mid( Articulo,1, nPos - 1 )
cArticulo = Trim( Mid( Articulo, nPos + 1 ) )

Set rstProd = CreaRecordSet( "SELECT * FROM prods WHERE articulo = '" & cArticulo & "'", Ambiente.Connection )

If rstProd.EOF Then
Exit Sub
End If

nCantidad = Round( Val2( cCantidad ) / rstProd("precio1"), 4 )

If Not rstProd.EOF Then
cantidadDeArticulos = nCantidad
llenaPartida rstProd("Articulo")
End If

CancelaProceso = True
End Sub

Sub incrementaProducto()
Dim rstArticulo, Query

Set rstArticulo = CreaRecordSet( _
"SELECT articulo FROM prods WHERE articulo = '" & Me.Articulo & "' AND granel = 0 AND speso = 0", _
Ambiente.Connection )

Set Query = NewQuery()
Set Query.Connection = Ambiente.Connection

If rstArticulo.EOF Then
Exit Sub
End If

For n = 0 To fg2.Rows - 1

If clEmpty( fg2.TextMatrix( n, 0 ) ) Then
Exit For
End If

If Ucase( Trim( fg2.TextMatrix(n,0) ) ) = _
UCase( Trim(Me.Articulo) ) Then

Query.SQL = _
"UPDATE partvta SET cantidad = cantidad + 1 WHERE id_salida = " & _
fg2.TextMatrix(n,7)
Query.Exec

fg2.TextMatrix(n,1) = Val2(fg2.TextMatrix(n,1)) + 1
CancelaProceso = True
Me.CalculaImportes
Exit For
End If

Next

End Sub

Publicado el Dejar un comentario

Colocar el texto en varias líneas

En algunas ocasiones necesitamos que se coloque el texto impreso en dos líneas; tal es el caso de las descripciones de artículos el IMPORTE CON LETRA, en los que aparece cortada la información.
En esta ocasión, nos enfocaremos en el Importe con Letra como ejemplo. vamos a colocar las primeras 15 letras en una línea y el resto en la línea siguiente.

Por default, el importe con letra se encuentra en una línea como esta (En CONFIGURACIÓN–PERSONALIZACIÓN–FORMATOS DEL SISTEMA–TICKET).
cSalida = cSalida & Letra( Round( Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")), 2 ), Trim(rstMoneda("Descrip")), True,rstMoneda("Nombre") ) & cLineaNueva

Lo que vamos a hacer es guardar el importe con letra en una variable llamada “ImporteLetra” y después dividir el texto en dos partes a través de la función Mid(texto, inicio, largo)
ImporteLetra = cSalida & Letra( Round( Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")), 2 ), Trim(rstMoneda("Descrip")), True,rstMoneda("Nombre") ) & cLineaNueva
cSalida = Mid(ImporteLetra, 1, 15)
cSalida = Mid(ImporteLetra, 16, 20)

Guarda y hace la prueba

En el caso de la remisión es algo parecido

FontBold Falso
FontItalic Falso
ColorDeFuente 0
Say 2.78125 + Row( Incremento ), 1.041667, rstArticulo("Descrip")

Lo que se hará es agregar una condición IF, la función Mid(texto, Inicio, Largo) y colocar todo este bloque de código cerca de la línea “Incremento = Incremento + 1” . El resultado quedará así:

EstableceFuente "Verdana",9.75
FontBold Falso
FontItalic Falso
ColorDeFuente 0
Say 2.78125 + Row( Incremento ), 1.041667, Mid(rstArticulo("Descrip"),1,50)
if Len( rstArticulo("Descrip") ) > 50 Then
Incremento = Incremento + 1
Say 2.78125 + Row( Incremento ), 1.041667, Mid(rstArticulo("Descrip"),41,50)
end if

Incremento = Incremento + 1
rstPartidas.MoveNext
Wend

Guardamos y hacemos la prueba

Publicado el 8 comentarios

Borra Saldos de Cliente de Mostrador

Para borrar el saldo del cliente de mostrador, creamos un nuevo procedimiento y le pegamos el siguiente código:

'|----------------------------------------------------------------------------------|
'| 2012-01-17 |
'| JOSE FELIX SANCHEZ (jofelchez@gmail.com) |
'| El siguiente procedimiento borra el saldo al Cliente de Mostrador |
'| (Cliente SYS) |
'|----------------------------------------------------------------------------------|

Sub Main()

Ambiente.Connection.Execute " update clients set SALDO = 0 where CLIENTE = 'sys' "

MyMessage "Proceso terminado"

End Sub

Guardamos y ejecutamos.

Como información adicional, para crear un procedimiento, tiene que ir a la ruta (dentro del sistema): CONFIGURACION–PERSONALIZACION–PROCEDIMIENTOS Y RUTINAS DE USUARIO.
Ahi da clic en Nuevo y pega el código antes mencionado.

Espero que sea de utilidad y me inviten un Pomo.

Publicado el 29 comentarios

Ticket Explicado Ejemplo

ticket_explicado_mybusinessposEn esta publicación se considera que la importancia de conocer cada parte del código que forma el ticket, ya que es necesario para hacer modificaciones. Además, es necesario tener conocimientos básicos de programación. En caso de que no cuente con ello, no se preocupe, podemos ofrecerle una solución que no requiere programación: el Editor de ticket. Este editor tiene un costo de un pomo de 700 pesos.



Ticket Explicado

132.00 KB 4754 descargas

Codigo de ticket explicado
'****************************************************************************************
'Visite http://helpmybusinesspos.info e inviteme un Pomo *
'2011_09_30 jose felix jofelchez@gmail.com. Invita un Pomo para poder subir más tips *
'vamos a configurar el ticket para que se imprima mas pequeño *
'Además se explica cada ina de las líneas de códogo. *
'****************************************************************************************
'los comentarios son de color verde. Los comentarios para esta explicación se encuentran en la parte derecha.
'para descomentar una linea, solo basta con quitar el apostrofo ql inicio de este.
Sub Main() 'iniciar el procedimiento. Main es el bloque principal del programa
Dim rstSeries 'declarar la variable rstSeries, la cual puede ser necesaria para el manejo de series (como en el caso del giro de telefonía)
Dim nDescuento 'declarar la variable nDescuento

'Ambiente.Torreta.PortOpen = False
'Ambiente.Torreta.Settings = "9600,N,8,1"
'Ambiente.Torreta.RTSEnable = True
'Ambiente.Torreta.PortOpen = True
'Ambiente.Torreta.CommPort = 1
'Ambiente.Torreta.OutPut = "ABC"
'Eventos
'Ambiente.Torreta.PortOpen = False

'cLineaNueva = Chr(13)
cLineaNueva = Chr(13) & Chr(10) ' definir cLineaNueva, es un salto de línea, el cual se usará mas adelante

'If MsgBox( "Desea imprimir el ticket", vbQuestion + vbYesNo + vbDefaultButton2 ) = vbNo Then
' Exit Sub
'End If 'en caso de que solo necesite imprimir algunos tickets, no todos, tendria que descomentar este bloquecito

' Creamos el recordSet del encabezado de la venta ' el recordset "Rst(consulta, Ambiente.Connection)" es la lista de datos que nos interesan (con condiciones) de una determinada tabla y se guardan en la variable "rstEncabezado". aqui va la Fecha, Observaciones generales, ID del Cliente, Importes Totales, Folio, Vendedor
Set rstEncabezado = Rst("SELECT * FROM ventas WHERE venta = " & prn.Documento, Ambiente.Connection ) '"prn.Documento" es el número de venta actual del Punto de Venta. ", Ambiente.Connection" es la conexion (a base de datos) en la que esta trabajando el sistema en este momento.

' Verificamos que la venta que se desea imprimir exista
if rstEncabezado.EOF Then 'en caso de que la consulta anterior no tenga datos se enviaría un mensaje de error
MsgBox "No existe la venta seleccionada",vbInformation
Exit Sub 'con "Exit Sub" terminamos el proceso y no se imprimirá nada. en este caso, se "mata" el proceso Sub Main(), porque estemos dentro de este.
end if 'Termina la condición den caso de que no arrojara datos el Rst()

' Creamos el recordSet de las partidas que componen la venta '' el recordset "Rst()" es la lista de datos que nos interesan (con condiciones) de una determinada tabla y se guardan en la variable "rstPartidas". Aqui van los articulos, precio, IVA, Descuentos,
'Set rstPartidas = Rst("SELECT partvta.prcantidad, partvta.iespecial, partvta.id_salida, partvta.kit, partvta.articulo, prods.precio1,prods.descrip, partvta.precio, partvta.cantidad, partvta.descuento, partvta.impuesto, partvta.preciobase, partvta.prdescrip, prods.serie FROM partvta INNER JOIN prods ON prods.articulo = partvta.articulo WHERE venta =" & rstEncabezado.fields("Venta"), Ambiente.Connection )
Set rstPartidas = Rst("SELECT partvta.prcantidad, partvta.iespecial, partvta.id_salida, partvta.kit, partvta.articulo, prods.precio1, partvta.observ, partvta.precio, partvta.cantidad, partvta.descuento, partvta.impuesto, partvta.preciobase, partvta.prdescrip, prods.serie FROM partvta INNER JOIN prods ON prods.articulo = partvta.articulo WHERE venta =" & rstEncabezado.fields("Venta"), Ambiente.Connection )

' Traemos todos los datos del cliente 'el recordset "Rst()" es la lista de datos que nos interesan (con condiciones) de una determinada tabla y se guardan en la variable "rstCliente". Aqui va el nombre del cliente, RFC, Direcciones, Descuentos, puntos acumulados
Set rstCliente = Rst("SELECT * FROM clients WHERE cliente = '" & rstEncabezado.fields("Cliente") & "'", Ambiente.Connection ) 'la condición de la consulta es que el cliente sea igual al del listado que se extrajo en la busqueda del encabezado del ticket "rstEncabezado.fields("Cliente")"

' Traemos los datos de cobranza si es que existe 'el recordset "Rst()" es la lista de datos que nos interesan (con condiciones) de una determinada tabla y se guardan en la variable "rstCobranza". Aqui van los articulos, precio, IVA, Descuentos,
Set rstCobranza = Rst( "SELECT * FROM cobranza WHERE venta = " & rstEncabezado("venta"), Ambiente.Connection )

cSalida = "" '"cSalida" es la variable que almacena todo el texto que se imprimirá. en este caso "cSalida" se prepara en blanco. es importane ver en las siguientes líneas cómo es que se va alimentando esta variable "cSalida"

'Esto abre el cajon de dinero
if Ambiente.rstEstacion("Cajon") <> 0 Then '"Ambiente.rstEstacion("Cajon")" es el valor de la ESTACION01, cuando se habilita (valor 1) el cajon de dinero en la pertaña de Impresora de Tickets, entonces entra en este bloque de código
cSalida = cSalida & Chr(27) & Chr(112) & Chr(48) & Chr(20) & Chr(20) '"Chr(27) & Chr(112) & Chr(48) & Chr(20) & Chr(20) & Chr(7)" es el código para abrir el cajon de dinero. este funciona solo con impresoras conectadas via LPT. en ocasiones varia este código dependiendo de la marca y modelo de impresora. Consulte el manual avanzado de su impresora para abrir el cajón.
cSalida = cSalida & Chr(7)
' Sansung de inyección
' cSalida = cSalida & Chr(27) & Chr(112) & Chr(48) & Chr(49)
end if

Set rstTextTicket = CreaRecordSet( "SELECT * FROM tickettext", Ambiente.Connection ) '"CreaRecordSet()" consulta si el usuario colocó algun mensaje en el encabezado y pie del ticket a traves de la utileria "editar texto del ticket" y lo almacena en "rstTextTicket"

If rstTextTicket.EOF Then 'en caso de que el usuario haya dejado vacio el encabezado y pie de ticket (rstTextTicket Nulo), entrar al bloque para colocar los datos de la Empresa que se colocan con la Configuración "Datos Generales de la Empresa"
cSalida = cSalida & "" & Ambiente.Empresa & cLineaNueva '"Ambiente.Empresa" es el nombre de la Empresa que se coloca con la Configuración "Datos Generales de la Empresa". "cLineaNueva" es un salto de linea en el ticket. en caso de que necesitara un salto mas solo basta agregar " & cLineaNueva" al final de esta liea
cSalida = cSalida & "" & Trim( Ambiente.Direccion1 ) & cLineaNueva ''"Trim( Ambiente.Direccion1 )" es la dirección que se encuentra en la primera linea, que se coloca con la Configuración "Datos Generales de la Empresa". la función "Trim()" elimina los espacios en blanco antes y al final de la dirección1
cSalida = cSalida & "" & Trim( Ambiente.Direccion2 ) & cLineaNueva ''"Trim( Ambiente.Direccion2 )" es la dirección que se encuentra en la segunda linea, que se coloca con la Configuración "Datos Generales de la Empresa". la función "Trim()" elimina los espacios en blanco antes y al final de la dirección2
cSalida = cSalida & "" & Trim( Ambiente.Telefonos ) & cLineaNueva ''"Trim( Ambiente.telefonos )" es el espacio para mostrar algun dato adicional que se coloca con la Configuración "Datos Generales de la Empresa". la función "Trim()" elimina los espacios en blanco antes y al final de la dirección1
Else

cSalida = cSalida & rstTextTicket("textheader") 'en caso de que el usuario haya colocado algun dato en el encabezado y pie de ticket, tomamos el Encabezado de este "rstTextTicket("textheader")" y lo agregamos a la variable "cSalida" con "cSalida = cSalida & "
End If

cSalida = cSalida & Trim( rstEncabezado("caja") ) & " " & Trim( rstEncabezado("Usuario") ) & " Ticket: " & rstEncabezado("No_referen") & cLineaNueva 'Agregamos los datos de la Caja "Trim( rstEncabezado("caja") )" , el usuario que atiende la Venta "Trim( rstEncabezado("Usuario") )" y el Folio del Ticket "rstEncabezado("No_referen")"

cSalida = cSalida & Formato( rstEncabezado("f_emision"),"dd-MM-yyyy" ) & " Hora: " & rstEncabezado("usuHora") & cLineaNueva 'Agregamos la fecha "Formato( rstEncabezado("f_emision"),"dd-MM-yyyy" )" y hora "rstEncabezado("usuHora")" de la Venta.

cDatos = "" & rstEncabezado("datos") '"rstEncabezado("datos")" es el nombre del cliente. en caso de que sea cliente general, aparecerá como "Cliente de Mostrador". el valor se agrega en la veriable "cDatos"

If clAt( ":", Trim(cDatos) ) = 1 Then 'condición especial. en caso de que en el nombre del cliente se encontraran unos puntos, haria un salto de linea y se almacena el valor en la variable "cSalida"
cSalida = cDatos & cLineaNueva
Else 'en caso contrario...
cSalida = cSalida & Trim( rstCliente("cliente") ) & " " & Trim( rstCliente("Nombre") ) & cLineaNueva '"Trim( rstCliente("cliente") )" es el ID del Cliente, "Trim( rstCliente("Nombre") )" es el Nombre del Cliente y se agrega a la variable "cSalida"
cSalida = cSalida & Trim( rstCliente("calle") ) & " " & Trim( rstCliente("colonia") ) & Chr(13) & Chr(10) '"Trim( rstCliente("calle") ) & " " & Trim( rstCliente("colonia") )" es la dirección del cliente. este valor se agrega a la variable "cSalida"
End If

'cSalida = cSalida & Ambiente.rstEstacion("leyendacomodin") & " " & rstEncabezado("comodin") & cLineaNueva 'Ambiente.rstEstacion("leyendacomodin") & " " & rstEncabezado("comodin") es por si deseamos un dato adicional a la venta, el cual se configura en la ESTACION01 como leyenda comodin

'cSalida = cSalida & "Vendedor: " & rstEncabezado("Vend") & cLineaNueva 'Clave del Vendedor "rstEncabezado("Vend")"

'cSalida = cSalida & Ambiente.Var9 & vbCrLf
'Ambiente.Var9 = ""

cSalida = cSalida & "CANT. DESCRIPCION IMPORTE" & cLineaNueva 'Cabecera de los articulos del ticket

nImporteTotal = 0 'Inicializamos las variables. "nImporteTotal" es el Importe Acumulado
nImpuesto = 0 '"nImpuesto" es el impuesto Acumulado
nCantidadTotal = 0 '"nCantidadTotal" es la cantidad total acumulada
nDescuentoTotal = 0 '"nDescuentoTotal" es El descuento Acumulado, en caso de que hubiese
nImporteOrigen = 0

'PrintText cSalida

While Not rstPartidas.EOF 'Mientras haya Partidas en la venta... Este ciclo se repite hasta que llega al final de la lista de artículos que incluye una Venta.

nPrecio = rstPartidas("Precio") * ( 1 - (rstPartidas("Descuento")/100) ) * (1 + ( rstPartidas("impuesto") / 100 ) ) 'Calcular el Precio Neto (quita descuentos al artículo y agrega impuesto) y se almacena en "nPrecio"
nPrecioBase = Round( rstPartidas("PrecioBase") * (1 + ( rstPartidas("impuesto") / 100 ) ), 2) 'considera el pecio Base (si hubiese) y lo guarda en "nPrecioBase"
nDescuento = (nPrecioBase - nPrecio) * rstPartidas("Cantidad") 'Aplica descuento al precio base, si hubiese y se guarda en "nDescuento"

If nPrecioBase > 0 Then 'en caso de que el precio base fuese mayor que 0, entra al bloque para aplicar un descuento al precio Base (este no es el Precio1, es diferente)
nDescPor = ( nPrecio / nPrecioBase ) * 100
Else
nDescPor = 0
End If

nDescuentoTotal = nDescuentoTotal + nDescuento '"nDescuentoTotal" va acumulando los descuentos
nImporte = nPrecio * rstPartidas("Cantidad") '"nImporte" es el importe del artículo (cantidad X Precio Unitario)
' nDescuento = Formato(rstPartidas("Descuento"))
'nCantidad = PadL(Formato( rstPartidas("cantidad") / rstPartidas("prCantidad"), "##,##0" ),3)
nCantidad = PadL(Formato( rstPartidas("cantidad") / rstPartidas("prCantidad"), "##,##0.00" ),3) '"nCantidad" es la canttdad dividida entre las unidades consideradas en la Presentación "rstPartidas("prCantidad")"

'cDescrip = PadL( Mid( rstPartidas("Descrip"), 1, 20 ), 20 ) '"cDescrip" es la descripción del artículo. en este caso, "PadL( Mid( rstPartidas("Descrip"), 1, 15 ), 15 )" quiere decir que va a considerar la descripción desde la linea 1 hasta la 20, ademas de que lo alineará a la derecha 20 letras.
cDescrip = PadL( Mid( rstPartidas("observ"), 1, 20 ), 20 ) '"cDescrip" es la descripción del artículo. en este caso, "PadL( Mid( rstPartidas("observ"), 1, 15 ), 15 )" quiere decir que va a considerar la descripción desde la linea 1 hasta la 20, ademas de que lo alineará a la derecha 20 letras.
nCantidadTotal = nCantidadTotal + ( rstPartidas("cantidad") / rstPartidas("prcantidad") ) '"nCantidadTotal" acumula la cantidad vendida entre las unidades de la presentación, si hubiese.

nImporteTotal = nImporteTotal + nImporte
nImpuesto = nImpuesto + ( nImporteTotal * ( rstPartidas("impuesto") / 100 ) )

nPrecio = 0 'este bloque es para manejar algun precio con Impuesto especial (como sucede en los cigarros o en las comunicaciones)
nIEspecial = rstPartidas("Precio") * (Val2(rstPartidas("iespecial")) / 100)
nIVa = rstPartidas("Precio") * (rstPartidas("impuesto") / 100)
nPrecio = rstPartidas("Precio") + nIEspecial + nIVa 'Suma el precio1, el Impuesto especial y el IVA. se guarda en "nPrecio"

Set rstArticulo = CreaRecordSet( "SELECT precio5 FROM prods WHERE articulo = '" & rstPartidas("articulo") & "'", Ambiente.Connection ) 'esto lo podemos omitir. es por si deseamos usar un precio especial

'cPrecio5 = PadL(Trim(Formato( rstArticulo("Precio5") + nIEspecial + nIVa, Ambiente.FDinero )),6)
cPrecio5 = PadL(Trim(Formato( nIVa, Ambiente.FDinero )),6) ' ESTE ES UN PRECIO ESPECIAL..POR SI SE LLEGASE A NECESITAR.
cPrecio = PadL(Trim(Formato( nPrecio, Ambiente.FDinero )),8) 'Este es el precio DEL ARTÍCULO que se IMPRIMIRÁ de cada Artículo. Se le da formato al Precio y se guarda en "cPrecio"
cImporte = PadL(Trim(Formato( Round( nPrecio, 2) * rstPartidas("cantidad") * (1 - (rstPartidas("descuento") / 100)), Ambiente.FDinero )),10) 'este es el Importe que se Imprimirá de cada Artículo, se almacena en "cImporte"
nPrecioOrigen = Round( rstPartidas("PrecioBase") * (1 + ( rstPartidas("impuesto") / 100 )),2) * rstPartidas("cantidad")
nImporteOrigen = nImporteOrigen + nPrecioOrigen

'strSalida = PadL(Formato( nCantidad, "##,##0.00" ),3) & " " & cDescrip & cLineaNueva & cPrecio & " " & cPrecio5 & " " & cImporte
'strSalida = PadL(Formato( nCantidad, "##,##0.00" ),3) & " " & cDescrip & cLineaNueva & cPrecio & " " & cImporte
'strSalida = PadL(Formato( nCantidad, "##,##0.00" ),3) & " " & cDescrip & cLineaNueva & " " & cImporte
strSalida = PadL(Formato( nCantidad, "##,##0.00" ),3) & " " & PadL( Mid( rstPartidas("observ"),1,16 ),16) & cImporte & cLineaNueva

'If rstPartidas("Precio1") > rstPartidas("Precio") Then
' nDescuentoPartida = ( rstPartidas("Precio1") - rstPartidas("Precio") ) * nCantidad
' strSalida = strSalida & " Descuento: " & Formato( nDescuentoPartida, "##,##0.00" ) & vbCrLf 'Si necesitamos que aparezca el descuento, descomentamos esta línea
'End If

'Si se necesita multiples lineas para la descripcion, colocaremos este bloque de codigo
if Len (rstPartidas("observ")) > 16 Then
strSalida = strSalida & " " & Mid( rstPartidas("observ"),17,16) & cLineaNueva
end if
if Len (rstPartidas("observ")) > 32 Then
strSalida = strSalida & " " & Mid( rstPartidas("observ"),33,16) & cLineaNueva
end if
cSalida = cSalida & strSalida & cLineaNueva

'If Not clEmpty( cNull( rstPartidas("prdescrip") ) ) Then
' cSalida = cSalida & Trim( rstPartidas("prdescrip") ) & vbCrLf
'End If

If rstPartidas("Kit") <> 0 Then
Set rstOpciones = CreaRecordSet( "SELECT partvtaopciones.articulo, prods.descrip FROM partvtaopciones INNER JOIN prods ON partvtaopciones.articulo = prods.articulo WHERE id_salida = " & rstPartidas("id_salida"), Ambiente.Connection )

While Not rstOpciones.EOF
cSalida = cSalida & "Opcion:" & rstOpciones("descrip") & Chr(13) & Chr(10)
rstOpciones.MoveNext
Wend
End If

If rstPartidas("serie") <> 0 Then

If rstEncabezado("ticket") <> 0 Then
Set rstSeries = CreaRecordSet( _
"SELECT * FROM series WHERE documento = 'TICKET' AND numeroDocumento = " & rstEncabezado( "no_referen" ) & " AND articulo = '" & rstPartidas("articulo") & "'", _
Ambiente.Connection )
Else
Set rstSeries = CreaRecordSet( _
"SELECT * FROM series WHERE documento = 'REMISION' AND numeroDocumento = " & rstEncabezado( "no_referen" ) & " AND articulo = '" & rstPartidas("articulo") & "'", _
Ambiente.Connection )
End If

While Not rstSeries.EOF

Serie = Trim( rstSeries("serie") )
Serie = PadL( Serie, 11 )
Serie = Mid( Serie, Len( Serie ) - 10 )

cSalida = cSalida & "SERIE: " & Serie & vbCrLf
rstSeries.MoveNext
Wend

End If

'Script.sendToPrinter Ambiente, (cSalida), prn.Pantalla
'cSalida = ""
'Dormir 100

rstPartidas.MoveNext

Wend

'PrintText cSalida

cSalida = cSalida & cLineaNueva
cSalida = cSalida & cLineaNueva

cSalida = cSalida & " Importe: " & PadL(Formato( Val2(rstEncabezado("importe")), Ambiente.FDinero ),9) & cLineaNueva
cSalida = cSalida & "Impuesto: " & PadL(Formato( Val2(rstEncabezado("impuesto")), Ambiente.FDinero ),9) & cLineaNueva

'if Val2(rstEncabezado("iespecial")) > 0 Then
' cSalida = cSalida & " Impuesto 2%: " & PadL(Formato( Val2(rstEncabezado("iespecial")), Ambiente.FDinero ),10) & cLineaNueva
'end if

if nDescuentoTotal > 0 Then
'cSalida = cSalida & " Importe: " & PadL(Formato( nImporteOrigen, Ambiente.FDinero ),10) & cLineaNueva
'cSalida = cSalida & " Descuento: " & PadL(Formato( nDescuentoTotal, Ambiente.FDinero ),10) & cLineaNueva
end if

cSalida = cSalida & " Total: " & PadL(Formato( Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")), Ambiente.FDinero ),9) & cLineaNueva
'cSalida = cSalida & "Redondeo: " & PadL(Formato( Val2(rstEncabezado("Redondeo")), "##0.00" ),9) & cLineaNueva ' si necesitamos mostrar redondeo, descomentamos esta linea
cSalida = cSalida & cLineaNueva
cSalida = cSalida & PadL(Formato( nCantidadTotal, "###,###.00" ),3) & "--TOTALES--" & PadL(Formato( (Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")) + Val2(rstEncabezado("redondeo"))), "$" & Ambiente.FDinero ),10) & cLineaNueva

nPagoTotal = Val2(rstEncabezado("Pago1")) + Val2(rstEncabezado("Pago2")) + Val2(rstEncabezado("Pago3"))

if rstEncabezado("Pago1") > 0 Then
cSalida = cSalida & " Pago en " & rstEncabezado("Concepto1") & " " & PadL(Formato( Val2(rstEncabezado("Pago1")), "$" & Ambiente.FDinero ),10) & cLineaNueva
end if

if rstEncabezado("Pago2") > 0 Then
cSalida = cSalida & " Pago en " & rstEncabezado("Concepto2") & " " & PadL(Formato( Val2(rstEncabezado("Pago2")), "$" & Ambiente.FDinero ),10) & cLineaNueva
end if

if rstEncabezado("Pago3") > 0 Then
cSalida = cSalida & " Pago en " & rstEncabezado("Concepto3") & " " & PadL(Formato( Val2(rstEncabezado("Pago3")), "$" & Ambiente.FDinero ),10) & cLineaNueva
end if

Eventos

If rstEncabezado("Comision") > 0 Then
cSalida = cSalida & " Comisión: " & PadL(Formato( Val2(rstEncabezado("comision")), "$" & Ambiente.FDinero ),10) & cLineaNueva
End If

nComision = rstEncabezado("comision")

if nPagoTotal < (Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")) + Val2(rstEncabezado("redondeo"))) Then cSalida = cSalida & " Credito: " & PadL(Formato( Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("iespecial")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("redondeo")) - nPagoTotal, "$" & Ambiente.FDinero ),9) & cLineaNueva else cSalida = cSalida & " Cambio: " & PadL(Formato( nPagoTotal - nComision - Val2(rstEncabezado("impuesto")) - Val2(rstEncabezado("iespecial")) - Val2(rstEncabezado("importe")) - Val2(rstEncabezado("redondeo")), "$" & Ambiente.FDinero ),9) & cLineaNueva end if Set rstMoneda = CreaRecordSet( "SELECT * FROM monedas WHERE moneda = '" & Ucase(Trim(rstEncabezado("moneda"))) & "'", Ambiente.Connection ) cSalida = cSalida & cLineaNueva cSalida = cSalida & cLineaNueva cSalida = cSalida & Letra( Round( Val2(rstEncabezado("impuesto")) + Val2(rstEncabezado("importe")) + Val2(rstEncabezado("iespecial")), 2 ), Trim(rstMoneda("Descrip")), True,rstMoneda("Nombre") ) & cLineaNueva If Not rstCliente.EOF Then cSalida = cSalida & cLineaNueva 'cSalida = cSalida & cLineaNueva If Val2( rstCliente( "saldo" ) ) > 0 Then
cSalida = cSalida & "Su saldo: " & Formato( rstCliente( "saldo" ), "$##,##0.00" ) & cLineaNueva
End If
End If

If rstTextTicket.EOF Then
'cSalida = cSalida & cLineaNueva
'cSalida = cSalida & cLineaNueva
cSalida = cSalida & cLineaNueva

cSalida = cSalida & "***** GRACIAS POR SU COMPRA *****" & cLineaNueva
cSalida = cSalida & cLineaNueva
cSalida = cSalida & cLineaNueva
cSalida = cSalida & cLineaNueva
cSalida = cSalida & "." & cLineaNueva
Else
cSalida = cSalida & rstTextTicket("textend")
End If

' Esto manda un corte de papel

if Ambiente.rstEstacion("ticketcorte") <> 0 Then
cSalida = cSalida & Chr(27) & Chr(105)
end if

'EstableceImpresora "EPSON TM-U220D Receipt"

msgbox " " & cSalida

'IniciaDocumento 'este bloque permite imprimir en una impresora USB (imprime en la impresora predeterminada de Windows). En caso de que desee imprimir con la que tiene configurada en ESTACION01, tendra que comentar estas 5 lineas del bloque.
'EstableceFuente "Courier New", 8 'Fuente que tendra el ticket USB
'Say 0,0.2, "" & cSalida 'Alineación del texto en el ticket, en pulgadas
'FinDocumento 'Termina el Ticket
'Exit Sub 'Termina el Procedimiento Main

' DATOS = ""
'
' Ambiente.Parent.OPOSPOSPrinter1.Open("POSPrinter")
' Ambiente.Parent.OPOSPOSPrinter1.ClaimDevice(1000)
' Ambiente.Parent.OPOSPOSPrinter1.DeviceEnabled = True
' rc = Ambiente.Parent.OPOSPOSPrinter1.SetBitmap(1, 2, "c:\lumen.bmp", 512, 0)
' DATOS = Chr(27) + "|1B"
' cSalida = DATOS & cSalida
' Ambiente.Parent.OPOSPOSPrinter1.PrintNormal 2, (cSalida)
' rc = Ambiente.Parent.OPOSPOSPrinter1.PrintBarCode(2, "7501086801046", 104, 70, 400, -2, -13)
' rc = Ambiente.Parent.OPOSPOSPrinter1.PrintNormal(2, Chr(10) + Chr(20) + Chr(10) + Chr(10) + Chr(10))
' rc = Ambiente.Parent.OPOSPOSPrinter1.CutPaper(100)

If Ambiente.Tag = "HTML" Then

Ambiente.Tag = ""

cSalida = Replace( cSalida, cLineaNueva, "
" )
cSalida = "

" & cSalida & "
"
CreaHtml "", (cSalida)

Else
Script.sendToPrinter Ambiente, (cSalida), prn.Pantalla 'enviamos a la impresorade tickets que esta definida en ESTACION01

'cSalida = cSalida & cLineaNueva & "COPIA PARA EL CLIENTE" 'En caso de que necesitemos un segundo ticket con la frase COPIA PARA EL CLIENTE , descomentamos esta linea
'Script.sendToPrinter Ambiente, (cSalida), prn.Pantalla 'En caso de que necesitemos un segundo ticket, descomentamos esta linea

Script.ImprimeFormato "VALESVENTA", prn.Documento, Ambiente, Me, False ' en caso de ser necesario, imprime el formato de Vale Venta

End If

End Sub