Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   Fujitsu COBOL (https://www.cobolforo.es/forumdisplay.php?f=77)
-   -   [Sintaxis] Problemas con comunicación impresoras fiscales. (https://www.cobolforo.es/showthread.php?t=1435)

Ale 1 de febrero de 2022 14:59

Problemas con comunicación impresoras fiscales.
 
Hola Coboleros.. tengo que comunicarme con impresora fiscal SAMS4S ELLIX40F. Con la herramienta de comunicación (SAMDRV.EXE) que viene con la impresora, que funciona como el viejo (PFBACH) logre programarla.
Pero ahora tengo que comunicarme por medio de la DLL que viene con la impresora.
Nunca lo hice, leyendo vi que las funciones o protocolos de esta DLL tengo que cargalas en COBOL85.
No se como se hace esto, paso a paso.
Tengo que ejecutar cobol85 y como agrego estos datos.?
powercobol 5
ej:
Código:

SerialPortOpen=Sam4sFiscalDriver.dll
SerialBaudSet=Sam4sFiscalDriver.dll

...

saludos a todos....

fastpho 2 de febrero de 2022 16:29

Hola @Ale, no he trabajado con este Impresor Fiscal , pero deberias mirar en el manual de la libreria cuales son los miembros de la clase "Sam4sFiscalDriver.DLL" para poder armar el archivo cobol85.cbr y luego
desde tu aplicacion llamar a esas funciones con los parametros que requiera tales miembros y calculo que devolvera un resultado a tales llamadas.

La libreria deberias registrarla , tu aplicacion y el archivo cobol85.cbr deben estar en el misma carpeta

En el foro hay varios ejemplos de como hacer estas llamadas (Ej Epson tm900 Fiscal , Epson no fiscal)

Saludos....

Ale 2 de febrero de 2022 19:50

hola y gracias por responderme fastpho.. si si el problema mío es que no se como se registran en cobol85 estas funciones. ej: SerialPortOpen=Sam4sFiscalDriver.dll no se como se hace para entrar al cobol85 e incluir estos compandos..
muchas gracias.. saludos.....

fastpho 2 de febrero de 2022 20:45

@Ale, el archivo cobol85.cbr es una archivo de texto , los editas con cualquier editor como bloc de notas o notepad etc ....
te quedaria algo asi ejemplo:
Código COBOL:
  1. [MainForm.Entry]
  2. SerialPortOpen=Sam4sFiscaldriver.dll
  3. SerialBaudset=Sam4sFiscaldriver.dll  
  4. AbrirTique=Sam4sFiscaldriver.dll

Luego dentro de tu aplicacion llamas a la funcion :

Código COBOL:
  1. WORKING-STORAGE SECTION.
  2.  01  Respuesta-Impresor       PIC S9(9) COMP-5.
  3.  01  Puerta                               PIC S9(9) COMP-5.
  4.  01  Funcion                             PIC X(50).
  5.  PROCEDURE DIVISION.
  6.      
  7.      MOVE "SerialPortOpen"   TO Funcion.              
  8.      MOVE 1                              TO Puerta. *>  COM1
  9.  
  10.      CALL Funcion  STDCALL  USING BY VALUE Puerta returning Respuesta-Impresor.

Hay muchos ejemplos en el foro de como implementarlo , bajate alguno y miralos .
Saludos

Ale 2 de febrero de 2022 21:45

Muchas Gracias Genio!!. voy a probar si me sale..
abrazo..
Ale.

Ale 6 de febrero de 2022 02:23

Ayuda con comunicación por Dll con impresor fiscal
 
Hola buenas noches. Sigo sin darme cuenta como comunicarme con impresora fiscal sam4s por intermedio de la DLL de la empresa.
no puedo abrir el puerto com1.
Parte del manual de las funciones de la DLL, dice asi:

MANUAL FUNCIONES

A continuación se describen las funciones que contiene la librería.
Ver ejemplos de uso en el Capítulo V y el la carpeta Ejemplos (incluida junto a esta documento).
int SerialPortOpen (int portnum)
Abre el puerto serial.
Parámetros:
portnum: número de puertos serial. Ej.: el COM8 es el 8.
Retorno: 1 en caso de éxito, 0 en caso de error.
int SerialBaudSet (int baudrate)
Establece la velocidad a usar con el puerto serial, debe coincidir con la configurada en el equipo. Por
ejemplo 115200. Llamar antes de SerialPortOpen. No tiene ningún efecto si el equipo se encuentra
conectado por USB.
Retorno: 1 en caso de éxito, 0 en caso de error.
int SerialPortClose ()
Cierra el puerto serial.
Retorno: 1 en caso de éxito, 0 en caso de error.
int IFOpBegin (const char * name)
Comienza a preparar un nuevo comando por nombre.
Parámetros:
name: nombre del comando. Ver comandos disponibles en el Capítulo III.
Retorno: 1 en caso de éxito, 0 en caso de error.
etc..

cargo las funciones y comando de la dll, en el cobol85 asi.

Código:

[tpv.Entry]
SerialPortOpen=Sam4sFiscalDriver.dll
SerialBaudSet=Sam4sFiscalDriver.dll
SerialPortClose=Sam4sFiscalDriver.dll
IFOpBegin=Sam4sFiscalDriver.dll
IFOpSend=Sam4sFiscalDriver.dll

dentro de mi programa.:

Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01 RESPUESTA-IMPRESOR    PIC S9(9) COMP-5.
  3.  01 FUNCION               PIC X(50).
  4.  PROCEDURE       DIVISION.
  5.   inicio.
  6.     MOVE "SerialPortClose ()" to FUNCION.
  7.     CALL FUNCION WITH STDCALL RETURNING RESPUESTA-IMPRESOR.

** cerrar el puerto me funciona, porque según el manual valor 1 = operacion correcta.
ahora cuando quiero abrirlo no me funciona se cierra el programa y no tira ningun error.:
Código COBOL:
  1. WORKING-STORAGE SECTION.
  2.  01 RESPUESTA-IMPRESOR    PIC S9(9) COMP-5.
  3.  01 FUNCION               PIC X(50).
  4.  PROCEDURE       DIVISION.
  5.   inicio.  
  6.     MOVE "SerialPortOpen (1)" to FUNCION.
  7.     CALL FUNCION WITH STDCALL RETURNING RESPUESTA-IMPRESOR.
*** no se que estoy haciendo mal. les agradecería me ayuden si alguno logra darse cuenta.
utilizo Powecobol 5
ahora les pongo un ejemplo en otros lenguajes.
Código VB:
  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         'MsgBox("Sam4sFiscalDriver Version: " + Drv.version)
  3.  
  4.         'Configura velocidad de comunicacion del puerto serial
  5.        Dim baudrate = 9600
  6.         If (Drv.SerialBaudSet(baudrate) = 0) Then
  7.             MsgBox("No se pudo configurar la velocidad " & baudrate)
  8.             Return
  9.         End If
  10.  
  11.         'Abre el puerto serial
  12.        Dim comnum = 8
  13.         If (Drv.SerialPortOpen(comnum) = 0) Then
  14.             MsgBox("No se pudo abrir el puerto serial " & comnum)
  15.             Return
  16.         End If
  17.  
  18.         ' Si hay un documento abierto, lo cancela primero
  19.        Drv.IFOpBegin("DocumentoEnCurso")
  20.         If (Drv.IFOpSend(1) = 0) Then
  21.             CmdError("DocumentoEnCurso")
  22.             Return
  23.         End If
  24.         If (Drv.IFOpRetIntGet("CodigoTipo") <> 0) Then
  25.             Drv.IFOpBegin("Cancelar")
  26.             If (Drv.IFOpSend(1) = 0) Then
  27.                 CmdError("Cancelar")
  28.                 Return
  29.             End If
  30.         End If
  31.        
  32.         'Ejemplo: Tique
  33.         Drv.IFOpBegin("AbrirTique")
  34.         If (Drv.IFOpSend(1) = 0) Then
  35.             CmdError("AbrirTique")
  36.             Return
  37.         End If
  38.  
  39.         Drv.IFOpBegin("ItemVenta")
  40.         Drv.IFOpParamSet("Descripcion", "Item de prueba")
  41.         Drv.IFOpParamFloatSet("Precio", 1.2345)
  42.         Drv.IFOpParamFloatSet("IVA", 21.0)
  43.         Drv.IFOpParamSet("CodigoProducto", "7791234567898")
  44.         If (Drv.IFOpSend(1) = 0) Then
  45.             CmdError("ItemVenta")
  46.             Return
  47.         End If


---------- Post añadido el 6 de febrero de 2022 a las 02:40 ----------

Perdón. logre encotrarle la vuelta
Código COBOL:
  1.  working...
  2.     01 NPORT                 PIC S9(9) COMP-5.
  3.  
  4.  
  5.     MOVE 1 TO NPORT.
  6.     MOVE "SerialPortOpen" to FUNCION.
  7.     CALL FUNCION WITH STDCALL USING BY VALUE NPORT RETURNING RESPUESTA-IMPRESOR.

ahora no me toma funciones. las envio asi.
Código COBOL:
  1.   MOVE 'IFOpBegin ("CierreZ")' TO FUNCION.
  2.   CALL FUNCION WITH STDCALL using by reference RESPUESTA-IMPRESOR.
el manual explica esto.:
Código CPP:
  1. int IFOpBegin (const char * name)
Comienza a preparar un nuevo comando por nombre.
Parámetros:
• name: nombre del comando. Ver comandos disponibles en el Capítulo III.
Retorno: 1 en caso de éxito, 0 en caso de error.

ejemplo en otro lenguaje..
Código CPP:
  1. drv.IFOpBegin("CierreZ");
  2.  cmd_send(drv);

saludos, perdón por las molestias.. muchas gracias...

Comentario de Moderador
Por favor, usa los botones de resalto de sintaxis para lenguajes de programación que hay en el editor.
También no crees hilos nuevos si ya existe uno tratando el mismo tema ;)

fastpho 6 de febrero de 2022 17:22

Hola @Ale, podes subir el manual al que haces referencia de la dll para poder ayudarte
Saludos..

Ale 7 de febrero de 2022 01:35

fiscales
 
1 Archivos Adjunto(s)
Hola y gracias nuevamente Fastpho por responderme..
Estoy un poco mareado con esta impresora, por intermedio de la aplicación Samdrv he podido hacerle funcionar casi todo. Pero no le encontre funciones para asociarle nota de credito a la factura..
Entonces me largue a tratar de comunicarme por intermedio de funciones y protocolos de la dll sams4sFiscalDriver.dll . Adjunto el manual.. lo unico logro hacer hasta ahora como puse en este tema es abrir y cerrar el puerto.. nada mas..
muchas gracias y saludos..

fastpho 7 de febrero de 2022 15:35

Informe Z Sam4s
 
@Ale,estuve viendo el manual tiene 2 librerias una para 32 y otra 64 bits , tenes que usar la 32
aparentemente no hay que registrarla solo copiarla dll en la carpeta del proyecto por lo que dice el manual .

Encontre en google un grupo de Visual FoxPro un programa en Python completo con todas las funciones te puede servir de ejemplo para traducirlo al powercobol.


y te paso el link del grupo para que leas los problemas que tienen con la libreria .....
https://groups.google.com/g/publices...m/Q-fexaz_AQAJ

Ejemplo para hacer una Informe Z

Código COBOL:
  1. WORKING-STORAGE SECTION.
  2.  01  Funcion-SAM4-LIB          PIC X(50).
  3.  01  sPort                     PIC S9(9) COMP-5.
  4.  01  sWait                     PIC S9(9) COMP-5.  
  5.  01  sBaudio                   PIC S9(9) COMP-5.
  6.  01  Respuesta-Impresor        PIC S9(9) COMP-5 value 0.
  7.  01  CierreZSam4s              PIC X(7) VALUE "CierreZ".
  8.  PROCEDURE       DIVISION.
  9. *> BAUDIOS DE COMUNICACION
  10. *SerialBaudSet
  11.      move spaces            TO Funcion-SAM4-LIB.
  12.      MOVE 115200            TO sBaudio. *> Chequear a que velocidad esta el impresor fiscal OJO !!!!
  13.      MOVE "SerialBaudSet"   TO Funcion-SAM4-LIB.
  14.      CALL Funcion-SAM4-LIB WITH  STDCALL  USING BY VALUE sBaudio      returning Respuesta-Impresor.
  15.      DISPLAY Respuesta-Impresor.    
  16.      IF Respuesta-Impresor NOT = 1
  17.          INVOKE POW-SELF "DisplayMessage" USING "ERROR"
  18.      END-IF.
  19.    
  20.      
  21. *> OPEN  PORT.
  22. *SerialPortOpen
  23.      move spaces             TO Funcion-SAM4-LIB.
  24.      MOVE 1                  TO sPort *> COM1  ,  Chequear en que puerto esta el impresor fiscal OJO !!!!!
  25.      MOVE "SerialPortOpen"   TO Funcion-SAM4-LIB.
  26.      CALL Funcion-SAM4-LIB WITH  STDCALL  USING BY VALUE sPort      returning Respuesta-Impresor.
  27.      DISPLAY Respuesta-Impresor.
  28.  
  29.      IF Respuesta-Impresor NOT = 1
  30.          INVOKE POW-SELF "DisplayMessage" USING "ERROR"
  31.      END-IF.
  32.          
  33.          
  34. *>CIERRE "Z"    
  35.      move spaces        TO Funcion-SAM4-LIB.
  36.      MOVE "IFOpBegin"   TO Funcion-SAM4-LIB.
  37.      CALL Funcion-SAM4-LIB WITH STDCALL USING BY REFERENCE CierreZSam4s returning Respuesta-Impresor.
  38.      DISPLAY Respuesta-Impresor.
  39.      IF Respuesta-Impresor NOT = 1
  40.          INVOKE POW-SELF "DisplayMessage" USING "ERROR"
  41.      END-IF.
  42.  
  43.      move spaces       TO Funcion-SAM4-LIB.
  44.      MOVE "IFOpSend"   TO Funcion-SAM4-LIB.
  45.      MOVE 1            TO sWait.
  46.      CALL Funcion-SAM4-LIB WITH STDCALL USING BY VALUE sWait returning Respuesta-Impresor.
  47.      DISPLAY Respuesta-Impresor.          
  48.      IF Respuesta-Impresor NOT = 1
  49.          INVOKE POW-SELF "DisplayMessage" USING "ERROR"
  50.      END-IF.
Saludos...

Ale 8 de febrero de 2022 02:58

fiscal
 
Muchas Gracias Fastpho.. me sirvió tu información, avanzo de apoco cada día.
Ahora me tira error y me cancela el comprobante cuando envio el comando ItemVenta y no se porque.
Código COBOL:
  1. WORKING..
  2.      01 PARAMETRO-VENTA       PIC X(9) VALUE 'ItemVenta'.
  3.  
  4.       MOVE SPACES TO FUNCION5.        
  5.       MOVE "IFOpBegin" TO FUNCION5.
  6.       CALL FUNCION5 WITH STDCALL USING BY REFERENCE PARAMETRO-VENTA RETURNING RESPUESTA-IMPRESOR.

Y lo hago luego de enviar sin errores el comando AbrirTique como corresponde el orden.
me falta poco, pero se me hace cada vez mas complicado..

Muchas Gracias nuevamente...
saludos...

Ale 15 de febrero de 2022 02:10

sintaxis
 
hola. tengo que enviar al impresor fiscal item venta, así como me indica el ejemplo.:
Código CPP:
  1. IFOpBegin("ItemVenta")
  2.         Drv.IFOpParamSet("Descripcion", "Item de prueba")
  3.         Drv.IFOpParamFloatSet("Precio", 1.2345)
  4.         Drv.IFOpParamFloatSet("IVA", 21.0)
  5.         Drv.IFOpParamSet("CodigoProducto", "7791234567898")

ahora en COBOL esta bien la sintaxis como la hago ? porque no me tira error, pero no me imprime ningun dato.
todo en cero. Y descripción espacio en blanco.
así envio por ejemplo el importe
No se si el error estara en la sintaxis del Call.

Código COBOL:
  1.       MOVE 'IFOpParamFloatSet' TO FUNCION.
  2.       MOVE 225.22 TO PARAMETRO-PRECIO3.
  3.       CALL FUNCION WITH STDCALL USING BY REFERENCE PARAMETRO-PRECIO1 PARAMETRO-PRECIO2
  4.       PARAMETRO-PRECIO3 RETURNING RESPUESTA-IMPRESOR.
  5.  
  6. working
  7.  01 PARAMETRO-PRECIO1  PIC X(6) VALUE 'Precio'.
  8.  01 PARAMETRO-PRECIO2  PIC X(2) VALUE ", ".  
  9.  01 PARAMETRO-PRECIO3  PIC 99999.99 VALUE ZEROS.

Perdón por molestar, le agradecería mucho me puedan ayudar a resolverlo.
saludos...

Comentario de Moderador

fastpho 15 de febrero de 2022 13:31

Hola @Ale, , por lo que se puede ver no estas respetando las funciones de la libreria.
*funcion IFOpParamFloatSet* devuelve un entero
Código CPP:
  1. int IFOpParamFloatSet (const char * name, double value)
La funcion recibe dos parametros le estas mandando 3 y chequea el retorno que es un entero si te da 0 error y 1 exito
El campo descripcion sale con espacios por que no lo estas mandando o pone el ejemplo completo usando botones de resalto.

Saludos...

Ale 15 de febrero de 2022 14:39

comunicación
 
Hola Fastpho como siempre agradecido por tu ayuda. Estas en lo cierto.. no había percatado eso.
pero lo raro es que me devuelve valor 1. pero no me imprime el importe, lo mismo me pasa con Descripcion. Y no me doy cuenta como armarlo solo con dos parámetros.
Probe varias formas y por ejemplo :
Código COBOL:
  1. 01 PARAMETRO-PRECIO1 PIC X(6) VALUE 'Precio'.
tengo que enviarlo en el using solo separado. ej:
Código COBOL:
  1. USING BY REFERENCE PARAMETRO-PRECIO1 PARAMETRO-PRECIO2
.... por eso tengo
dividirlo en 3.
saludos y muchas gracias por tu ayuda....

fastpho 16 de febrero de 2022 14:43

sintaxis
 
Hola @Ale , te paso un ejemplo de como pasar parametros a la funciones.
Código COBOL:
  1. WORKING-STORAGE SECTION.
  2.  01 Titulo-descripcion      pic x(11)    value "Descripcion".
  3.  01 Titulo-precio           pic x(6)     value "Precio".
  4.  01 Description             pic x(15)    value "Prueba de Venta".
  5.  01 Precio                  pic s9(9)   COMP-5.
  6.  01 SALIDA-IMPRESOR         pic s9(9) COMP-5 value 0.

Código CPP:
  1. int IFOpParamSet (const char * name, const char * value)

Código COBOL:
  1. *******************************************    
  2. * Descripcion
  3. *************
  4.      move spaces                    TO FUNCION.
  5.      MOVE "IFOpParamSet"   TO FUNCION.
  6.      CALL FUNCION WITH STDCALL USING BY REFERENCE Titulo-descripcion
  7.                                                    BY REFERENCE      Description
  8.                                                    returning SALIDA-IMPRESOR.

Código CPP:
  1. int IFOpParamIntSet (const char * name, int value)

Código COBOL:
  1. *******************************************    
  2. * Precio
  3. ********
  4.      move spaces                        TO FUNCION.
  5.      move 123                               TO Precio.
  6.      MOVE "IFOpParamIntSet"   TO FUNC-SAM4-LIB.
  7.      CALL FUNCION WITH STDCALL USING BY REFERENCE Titulo-precio
  8.                                                   BY VALUE      Precio
  9.                                                   returning SALIDA-IMPRESOR.
Saludos ....

Ale 17 de febrero de 2022 01:32

hola fastpho. nuevamente gracias por tu gran ayuda..
Buenísimo los ejemplos fue un gran asesoramiento, pero vos sabes que Precio sigue sin funcionar.. me lo imprime en 0.00 al tique.
Descripción si anda.. pero todo lo que sea importe ya sea Precio, Cantidad, Iva. no anda ninguno.
realmente se me acaba el tiempo y no logro hacerlo funcionar..
un gran saludo...
y agradecido como siempre.

fastpho 17 de febrero de 2022 12:44

sintaxis
 
Hola @Ale deberia funcionarte usando en todos los campos numericos , el ejemplo
que te puse , es decir usando la funcion Entero , NO uses la del Funcion Flotante.


Código CPP:
  1. int IFOpParamIntSet (const char * name, int value)

Saludos.....

Ale 17 de febrero de 2022 13:37

Hola fastpho, perdón pero no me doy cuenta.. pongo otro ejemplo en otro lenguaje por las dudas.
Probé de varias maneras y no hay caso. Lo unico pude hacer funcionar es "Descripcion".

Código CPP:
  1. printf("AbrirTique\n");
  2.         IFOpBegin("AbrirTique");
  3.         cmd_send();
  4.  
  5.         printf("ItemVenta\n");
  6.         IFOpBegin("ItemVenta");
  7.         IFOpParamSet("Descripcion", "Item de prueba");
  8.         IFOpParamFloatSet("Precio", 1.2345);
  9.         IFOpParamFloatSet("IVA", 21.0);
  10.         IFOpParamSet("CodigoProducto", "7791234567898");
  11.         cmd_send();
  12.         printf("Cerrar\n");
  13.         IFOpBegin("Cerrar");
saludos. Ale.

Fito 17 de febrero de 2022 14:54

Hola:

Los valores numéricos tenés que finalizarlos con un null. Ejemplo

Código COBOL:
  1.  
  2. Working...
  3.  
  4.      02 oCant.
  5.         03 xxCant         pic 9(5).9999.            *> Cantidad
  6.         03                pic x value X"00".
  7.  
  8.      02 oPreuni.
  9.         03 xxPreuni       pic 9(7).9999.            *> Precio unitario.
  10.         03                pic x value X"00".
  11. Procedure...
  12.  
  13.         call ImprimirItem with stdcall using
  14.            by value     xSuma
  15.            by reference oArtdenom
  16.            by reference oCant
  17.            by reference oPreuni
  18.            by value     oIva
  19.            by value     oImpint
  20.            by reference oValor
  21.            by value     oIdCod
  22.            by reference oCodigo
  23.            by reference oCodigoUM
  24.            by value     oMedida
  25.            returning wError

Saludos...

Fito...

Ale 14 de marzo de 2025 16:35

sigo probando. ayuda por favor...
 
hola amigos! espero que estén bien..
Aun no puedo lograr enviar esta función a la fiscal (no me funciona),
para enviar el importe en decimales item y cantidad.

manual de la DLL: dice
Código CPP:
  1. int IFOpParamFloatSet (const char * name, double value)

Agrega un parámetro de número flotante por nombre al comando que se está preparando.
Parámetros:
• name: nombre del parámetro. Ver detalles en el Capítulo III.
• value: valor del parámetro. Retorno: 1 en caso de éxito, 0 en caso de error.

ejemplos: otro lenguaje.
Código VB:
  1. drv.IFOpParamFloatSet("Precio", 1.2345);
  2.    
  3.            oPrtFis:IFOpParamFloatSet("Precio", aLinea5).


como se envía con cobol.? y como lo defino en la working a la variable que lleva el precio del articulo.
01 precio.... ya probé definiéndolo como PIC S9(9) COMP-5 y no anduvo.

algo así tengo armado:
Código COBOL:
  1.      move spaces                        TO FUNCION.
  2.      MOVE "IFOpParamFloatSet"   TO FUNCION
  3.      CALL FUNCION WITH STDCALL USING BY REFERENCE PARAMETRO-PRECIO
  4.                                                   BY VALUE      Precio
  5.                                                   returning SALIDA-IMPRESOR.
  6.  
  7.  WORKI...
  8.      01 PARAMETRO-PRECIO        pic x(6)     value "Precio".
  9.      01 precio ....  ?????

Si alguien me puede dar una mano, desde ya muchas gracias..
Saludos a todos....

fastpho 14 de marzo de 2025 18:01

Hola Ale

Para poder ayudarte podrias poner que version de powercobol estas usando , en que entorno estas
la impresora fiscal es ????? , esta fiscalizada o en modo entrenamiento , tipo comunicacion
serial o usb , que libreria estas usando , Podes sacar X y Z basico , subi un pequeño proyecto
para verlo completo como abris el puerto , como lo cerras , como haces el proceso de venta del item o articulo
etc etc

Respeta las normas del foro.....

Saludos ....

Kuk 14 de marzo de 2025 20:51

@Ale, por lo que veo en el ejemplo, debes usar tipo float, que en Cobol correponde a COMP-1 o COMP-2, de 4 y 8 bytes respectivamente (single & double precision).

Código COBOL:
  1.      01 PARAMETRO-PRECIO        pic x(6)     value "Precio".
  2.      01 precio                  COMP-1.

Ale 15 de marzo de 2025 04:20

controlador fiscal
 
hola nuevamente, muchas gracias por responder.
Perdón por incumplir las normas del foro, tendré que leerlas bien, para entenderlas.
Kuk voy a probar con COMP-1 O COMP-2 como me indicaste.
Este tema lo inicie yo hace bastante ya.
Utilizo powercobol V5, windows10, controlador Ellix40f .
utilizo la Dll: Sam4sFiscalDriver.dll
comunicación serial, a modo entrenamiento.

Abro el puerto, configuro la velocidad Baudios, abro item tiquet por ejemplo. todo bien. hasta ahí.
envio el comando: ItemVenta. como el ejemplo que envio, y tambien me lo toma bien.

Código COBOL:
  1.    working...
  2.    01 PARAMETRO-DESCRI1     PIC X(11) ValUE "Descripcion".  
  3.    01 PARAMETRO-DESCRI3     PIC X(32) VALUE spaces.
  4.  
  5.       MOVE "IFOpParamSet" TO FUNCION.
  6.       MOVE "Descripcion articulo1" TO PARAMETRO-DESCRI3.
  7.       CALL FUNCION WITH STDCALL USING BY REFERENCE PARAMETRO-DESCRI1                                    
  8.                                       BY REFERENCE PARAMETRO-DESCRI3
  9.                                       RETURNING RESPUESTA-IMPRESOR.

el problema es que no le encuentro la vuelta cuando envío comando Precio por ejemplo, que tiene que ser según el manual de la dll:
Código CPP:
  1. int IFOpParamFloatSet (const char * name, double value)
, (como explique en mensajes anteriores y también envie el manual).
El numero decimal creo que serian 7 entero 2 decimales. ¿Como definiría en la working... el importe del item? para que funcione.
saludos a todos.

Kuk 15 de marzo de 2025 10:43

@Ale, estas son las correspondencias de tipos:

[TABLE]Tipo C|Tipo COBOL
float|COMP-1
double|COMP-2[/TABLE]

Ambos son de coma flotante, es decir, no tiene posición fija para decimales.

Una vez que hayas recibido el valor, tienes que hacer un MOVE a un campo con decimales fijas, obtendrás así el valor en el formato que quieras (con cuantas decimales prefieras).

Ale 15 de marzo de 2025 16:11

controlador fiscal
 
Buen día genios.

Kuk
probe como me dijiste y nada. sigue largando en 0,00 el tiquet

Lo hago así. No se que esta mal.
Código COBOL:
  1.    WORKING...
  2.  01 funcion      PIC X(30) value spaces.
  3.  01 precio-uni    COMP-1.
  4.  01 unitario             PIC 9(7)V9(2) VALUE ZEROS.
  5.  01 comando-item-precio  PIC X(6) VALUE "Precio".
  6.  
  7.  
  8.  
  9.   procedure....    
  10.       move "IFOpParamFloatSet" to funcion.
  11.       move 2563.33 to unitario.
  12.       move unitario to precio-uni.
  13.       CALL funcion WITH STDCALL USING BY REFERENCE comando-item-precio
  14.                                       BY REFERENCE precio-uni
  15.                                       RETURNING respuesta-impresor.

probe tambien con By value y el compilador me tira error.

saludos y muchas gracias por su ayuda..

Kuk 15 de marzo de 2025 16:16

@Ale, esto:

Código CPP:
  1. int IFOpParamFloatSet (const char * name, double value)

se traduciría así:

Código COBOL:
  1.  01 precio-uni    COMP-2.   *> Double
  2. ...
  3.       CALL funcion WITH STDCALL USING BY CONTENT comando-item-precio
  4.                                       BY VALUE precio-uni
  5.                                       RETURNING respuesta-impresor

Ale 15 de marzo de 2025 17:06

controlador fiscal
 
Kuk lo hago como me indicas.

y el compilador me tira este error.

Código:

** DIAGNOSTIC MESSAGE ** (SAMTIQUE)
SAMTIQUE CmCommand1-Click(148) :  JMN3355I-S  'PRECIO-UNI' OF BY VALUE IN CALL STATEMENT MUST BE BINARY ITEM THAT USAGE IS COMPUTATINAL-5 AND LENGTH MUST NOT EXCEED 4 BYTES,1 BYTE ITEM OR NUMERIC LITERAL WITH UNDER THAN 9 DIGITS.


Kuk 15 de marzo de 2025 21:24

@Ale, inténtalo así a ver:

Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01 funcion              PIC X(30) value spaces.
  3.  01 precio-uni           COMP-2.
  4.  01 precio-uni-bin redefines precio-uni BINARY-LONG.
  5.  01 unitario             PIC 9(7)V9(2) VALUE ZEROS.
  6.  01 comando-item-precio  PIC X(6) VALUE "Precio".
  7.  
  8.  PROCEDURE DIVISION.
  9.       move "IFOpParamFloatSet" to funcion
  10.       move 2563.33 to unitario
  11.       move unitario to precio-uni
  12.      
  13.       CALL funcion WITH STDCALL USING BY CONTENT comando-item-precio
  14.                                       BY VALUE precio-uni-bin
  15.                                       RETURNING respuesta-impresor
  16.                                      

Ale 15 de marzo de 2025 22:49

controlador fiscal
 
Ya me había ilusionado. lo probe, pero me tira este error al compilar.

SAMTIQUE CmCommand1-Click(44) : JMN1123I-S INVALID WORD 'BINARY-LONG' IS FOUND. IGNORED UNTIL NEXT VALID PARAGRAPH,SECTION OR DIVISION.
SAMTIQUE CmCommand1-Click(44) : JMN2222I-S PICTURE CLAUSE IS MISSING. PICTURE 9 ASSUMED.

escapa a mi saber...

fastpho 16 de marzo de 2025 01:38

Ale la version de powercobol v.5 desconoce la
declaracion BINARY-LONG.

Subi el ejemplo COMPLETO de como
estas armando para enviar el comando "ItemVenta"

como estas enviando los parametros ?

Descripcion
Cantidad
Precio
Iva
MontoImpIntFijo
CodigoInterno
CodigoProducto
UnidadMedida



tambien subi el archivo cobol85.cbr para ver como declaraste las funciones del libreria

Saludos...



Post añadido a las 01:38. Post anterior a las 01:27


Ale podes sacar x y Z ?

Saludos

Ale 16 de marzo de 2025 02:32

controlador fiscal
 
Hola fastpho.
Esto tengo.

Código COBOL:
  1. cobol85.cbr
  2. [samtique.Entry]
  3. SerialPortOpen=Sam4sFiscalDriver.dll
  4. SerialBaudSet=Sam4sFiscalDriver.dll
  5. SerialPortClose=Sam4sFiscalDriver.dll
  6. IFOpBegin=Sam4sFiscalDriver.dll
  7. IFOpSend=Sam4sFiscalDriver.dll
  8. IFOpWaitingIs=Sam4sFiscalDriver.dll
  9. IFOpWait=Sam4sFiscalDriver.dll
  10. IFOpAbort=Sam4sFiscalDriver.dll
  11. IFOpParamSet=Sam4sFiscalDriver.dll
  12. IFOpParamGet=Sam4sFiscalDriver.dll
  13. IFOpParamIntSet=Sam4sFiscalDriver.dll
  14. IFOpParamIntGet=Sam4sFiscalDriver.dll
  15. IFOpParamFloatSet=Sam4sFiscalDriver.dll
  16. IFOpParamFloatGet=Sam4sFiscalDriver.dll
  17. IFOpParamBoolSet=Sam4sFiscalDriver.dll
  18. IFOpParamBoolGet=Sam4sFiscalDriver.dll
  19. IFOpCmdOkIs=Sam4sFiscalDriver.dll
  20. IFOpErrorGet=Sam4sFiscalDriver.dll
  21. IFOpErrorDescGet=Sam4sFiscalDriver.dll
  22. IFOpStateGet=Sam4sFiscalDriver.dll
  23. IFOpRetGet=Sam4sFiscalDriver.dll
  24. IFOpRetIntGet=Sam4sFiscalDriver.dll
  25. IFOpRetFloatGet=Sam4sFiscalDriver.dll
  26. IFOpRetBoolGet=Sam4sFiscalDriver.dll
  27. IFOpBusyStateGet=Sam4sFiscalDriver.dll
  28. IFOpBusyStepGet=Sam4sFiscalDriver.dll
  29. IFOpBusyTotalGet=Sam4sFiscalDriver.dll
  30. IFOpListGet=Sam4sFiscalDriver.dll
  31. IFOpParamListGet=Sam4sFiscalDriver.dll
  32. IFOpRetListGet=Sam4sFiscalDriver.dll
  33. IFOpStateListGet)=Sam4sFiscalDriver.dll

Código COBOL:
  1. ***   ejemplo simplificado. **** mainform = samtique
  2.  workimg..
  3.  01 FUNCION               PIC X(25) VALUE SPACES.
  4.  01 COMANDO               PIC X(50).
  5.  01 RESPUESTA-IMPRESOR    PIC S9(9) COMP-5.
  6.  01 ABRE-TIQUE            PIC X(10) VALUE "AbrirTique".
  7.  01 COMANDO-ITEM-VTA        PIC X(9) value "ItemVenta".
  8.  01 COMANDO-ITEM-CANTI      PIC X(8) VALUE  "Cantidad".
  9.  01 COMANDO-ITEM-PRECIO     PIC X(6) VALUE "Precio".
  10.  01 COMANDO-ITEM-IVA        PIC X(3) VALUE "IVA".
  11.  01 COMANDO-ITEM-CODIGO     PIC X(14) VALUE "CodigoProducto".
  12.  01 CODIGO-LINEA-ITEM       PIC X(15) VALUE SPACES.
  13.  
  14.  
  15.  procedure division.
  16.   inicio.
  17. *** ya movio 9600 a baudios.
  18. *** ya abrio el puerto com.
  19. ****************** ACA ARRANCA CON EL TIQUE *****************
  20.       MOVE SPACES TO FUNCION3.    
  21.       MOVE "IFOpBegin" to FUNCION.      
  22.       CALL FUNCION WITH STDCALL USING BY REFERENCE ABRE-TIQUE RETURNING RESPUESTA-IMPRESOR.
  23.       IF RESPUESTA-IMPRESOR = 1 MOVE "ABRO-TIQUET" TO POW-TEXT OF ABRO-TIQUE.                
  24.       PERFORM ENVIAR-COMANDO.    
  25. ***    
  26. ***  AHORA ARRANCA CON ITEM-VENTAS
  27.       MOVE SPACES TO FUNCION.    
  28.       MOVE "IFOpBegin" to FUNCION.      
  29.       CALL FUNCION3 WITH STDCALL USING BY REFERENCE COMANDO-ITEM-VTA RETURNING RESPUESTA-IMPRESOR.
  30.       IF RESPUESTA-IMPRESOR = 1 MOVE "item si" TO POW-TEXT OF ERROR-ITEM.
  31. ****  descripcion articulo.
  32.       MOVE SPACES TO FUNCION.
  33.       MOVE "IFOpParamSet" TO FUNCION.
  34.       MOVE "Bomba de agua" TO PARAMETRO-DESCRI3.
  35.       CALL FUNCION WITH STDCALL USING BY REFERENCE PARAMETRO-DESCRI1                                    
  36.                                       BY CONTENT PARAMETRO-DESCRI3
  37.                                       RETURNING RESPUESTA-IMPRESOR.
  38.       MOVE RESPUESTA-IMPRESOR TO POW-TEXT OF ERROR-DESCRI.
  39. *** ahora cantidad.
  40.       MOVE SPACES TO FUNCION.
  41.       MOVE "IFOpParamFloatSet" TO FUNCION.
  42.       MOVE 33.33 TO CANT-UNI.
  43.       CALL FUNCION WITH STDCALL USING BY REFERENCE COMANDO-ITEM-CANTI
  44.                                       BY REFERENCE CANT-UNI
  45.                                       RETURNING RESPUESTA-IMPRESOR.
  46.  
  47. *** Ya esta ultima Función es la que no me funciona, enviar valor flotante.
  48. **************
  49.  
  50. ********************************************
  51. ******************** envia comando. *******
  52.   enviar-comando.
  53.       MOVE 1 TO ESPERA.
  54.       move spaces to comando.
  55.       MOVE "IFOpSend" TO COMANDO.
  56.       CALL COMANDO WITH STDCALL USING BY VALUE ESPERA RETURNING RESPUESTA-IMPRESOR.
  57.       MOVE RESPUESTA-IMPRESOR TO POW-TEXT OF VELO4.

Perdón porque utilizo en mayuscula para programar, porque no veo bien.
Tengo hasta ahí echo, porque Precio, Iva, me pasaría lo mismo (no se como enviar Valor flotante).
el tique hasta descripción del articulo, lo imprimo. luego sale del programa y no responde mas.

gracias por su ayuda....

Kuk 16 de marzo de 2025 11:19

@Ale, bueno pues inténtalo así, con COMP-1:

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  pgm      pic x(10) value "program".
  5.  01  double   comp-1.
  6.  01  num redefines double pic s9(9) comp-5.
  7.  
  8.  PROCEDURE       DIVISION.
  9.      
  10.      call pgm using by content "Precio"
  11.                     by value num

El caso es que este es de 4 bytes, y lo importes muy grandes no van a entrar.

fastpho 16 de marzo de 2025 14:57

@Ale proba con este ejemplo a ver si enviando
valores enteros a la .dll logras facturar
algo , juga con los numeros de los campos
cantidad precio y ver si logras que el impresor
multiplique la cantidad por el precio y facture
un importe.


Otra cosa podes sacar el informe Z ?

Saludos ..
Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2. *---------------------------------------------------------
  3.  01  FUNC-SAM4-LIB          PIC x(50).
  4.  01  sWait                  PIC s9(9) COMP-5.  
  5.  01  Respuesta-Impresor     PIC s9(9) COMP-5 value 0.
  6. *---------------------------------------------------------
  7.  01 AbrirTiquetSam4s        PIC x(10)  VALUE "AbrirTique".
  8.  01 CerrarSam4s             PIC x(6)   VALUE "Cerrar".
  9.  
  10.  
  11.  01 ItemVentaSam4s          PIC x(9)   VALUE  "ItemVenta".
  12.  01 ItemBonificacionSam4s   PIC x(16)  VALUE  "ItemBonificacion".
  13.  
  14.  01 titulo-descripcion      PIC x(11)  value "Descripcion".
  15.  01 titulo-precio           PIC x(6)   value "Precio".
  16.  01 titulo-iva              PIC x(3)   value "IVA".
  17.  01 titulo-codigointerno    PIC x(13)  value "CodigoInterno".
  18.  01 titulo-cantidad         PIC x(8)   value "Cantidad".
  19.  01 titulo-unidadmedida     PIC x(12)  value "UnidadMedida".
  20.  01 titulo-impinterno       PIC x(15)  value "MontoImpIntFijo".  
  21.  
  22.  01 ArticuloSam4                PIC x(13).
  23.  01 DescriptionSam4             PIC x(40).
  24.  01 PrecioSam4                  PIC s9(9)   COMP-5.
  25.  01 IvaSam4                     PIC s9(9)   COMP-5.
  26.  01 CantidadSam4                PIC s9(9)   COMP-5.
  27.  01 MontoImpIntFijoSam4         PIC S9(9)   COMP-5.
  28.  01 UnidadMedidaSam4            PIC s9(9)   COMP-5.
  29.  
  30.  PROCEDURE       DIVISION.
  31. **********************************************************    
  32. *Begin AbrirTique
  33.  
  34.      move spaces        TO FUNC-SAM4-LIB.
  35.      MOVE "IFOpBegin"   TO FUNC-SAM4-LIB.
  36.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY REFERENCE AbrirTiquetSam4s returning Respuesta-Impresor.
  37.  
  38.        
  39. **********************************************************    
  40. *Send AbrirTiquetSam4s
  41.      move spaces       TO FUNC-SAM4-LIB.
  42.      MOVE "IFOpSend"   TO FUNC-SAM4-LIB.
  43.      MOVE 1            TO sWait.
  44.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY VALUE sWait returning Respuesta-Impresor.
  45.  
  46.      
  47.  
  48. *-----------------------------------------------------------------------------------------------------------------------      
  49. * Los campos PrecioSam4 IvaSam4 CantidadSam4 MontoImpIntFijo UnidadMedidaSam4 USAMOS LA FUNCION ENTERO : IFOpParamIntSet
  50. *-----------------------------------------------------------------------------------------------------------------------      
  51.  
  52. *************************************************************************
  53. * muevo valores necesarios para poder facturar un item o articulo
  54.  
  55.  
  56.      move 1210          TO PrecioSam4.
  57.      move 2100          TO IvaSam4.  
  58.      move 5000          TO CantidadSam4.
  59.      move zeros         TO MontoImpIntFijoSam4.
  60.      move 7             TO UnidadMedidaSam4.
  61.  
  62.  
  63.      move "Esto es una prueba" TO DescriptionSam4.
  64.      move "7790060023417"      TO ArticuloSam4.
  65.          
  66. ****************************************    
  67. *Begin ItemVenta
  68.      move spaces        TO FUNC-SAM4-LIB.
  69.      MOVE "IFOpBegin"   TO FUNC-SAM4-LIB.
  70.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY REFERENCE ItemVentaSam4s
  71.                                            returning Respuesta-Impresor.
  72.                                          
  73. ************    
  74. *Descripcion
  75.  
  76.      move spaces           TO FUNC-SAM4-LIB.
  77.      MOVE "IFOpParamSet"   TO FUNC-SAM4-LIB.
  78.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY REFERENCE titulo-descripcion
  79.                                            BY REFERENCE DescriptionSam4
  80.                                            returning Respuesta-Impresor.
  81.  
  82.  
  83. **********
  84. *Cantidad
  85.      move spaces              TO FUNC-SAM4-LIB.
  86.      MOVE "IFOpParamIntSet"   TO FUNC-SAM4-LIB.
  87.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY CONTENT titulo-cantidad
  88.                                            BY VALUE   CantidadSam4
  89.                                            returning Respuesta-Impresor.
  90.  
  91.                                            
  92.  
  93.      
  94. *******
  95. *Precio
  96.      move spaces              TO FUNC-SAM4-LIB.
  97.      MOVE "IFOpParamIntSet"   TO FUNC-SAM4-LIB.
  98.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY REFERENCE titulo-precio
  99.                                            BY VALUE      PrecioSam4
  100.                                            returning Respuesta-Impresor.
  101.  
  102.                                            
  103. ****
  104. *Iva
  105.      move spaces                TO FUNC-SAM4-LIB.
  106.      MOVE "IFOpParamIntSet"     TO FUNC-SAM4-LIB.
  107.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY REFERENCE titulo-iva
  108.                                            BY VALUE     IvaSam4
  109.                                            returning Respuesta-Impresor.
  110.  
  111.      
  112. ****************    
  113. *Codigo Interno
  114.      move spaces           TO FUNC-SAM4-LIB.
  115.      MOVE "IFOpParamSet"   TO FUNC-SAM4-LIB.
  116.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY REFERENCE titulo-codigointerno
  117.                                            BY REFERENCE     ArticuloSam4
  118.                                            returning Respuesta-Impresor.
  119.  
  120. ****************************
  121. *MontoImpIntFijo
  122.      move spaces              TO FUNC-SAM4-LIB.
  123.      MOVE "IFOpParamIntSet"   TO FUNC-SAM4-LIB.
  124.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY REFERENCE     titulo-impinterno
  125.                                            BY VALUE         MontoImpIntFijoSam4
  126.                                            returning Respuesta-Impresor.
  127.  
  128.  
  129. *****************
  130. *Unidad de Medida
  131.      move spaces           TO FUNC-SAM4-LIB.
  132.      MOVE "IFOpParamIntSet"   TO FUNC-SAM4-LIB.
  133.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY REFERENCE titulo-unidadmedida
  134.                                            BY VALUE     UnidadMedidaSam4
  135.                                            returning Respuesta-Impresor.
  136.  
  137.  
  138. **********************************************************    
  139. *Send item
  140.      move spaces       TO FUNC-SAM4-LIB.
  141.      MOVE "IFOpSend"   TO FUNC-SAM4-LIB.
  142.      MOVE 1            TO sWait.
  143.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY VALUE sWait returning Respuesta-Impresor.
  144.  
  145.      
  146.      
  147.  
  148. *------------------------
  149. *Begin "Cerrar"      
  150.      move spaces        TO FUNC-SAM4-LIB.
  151.      MOVE "IFOpBegin"   TO FUNC-SAM4-LIB.
  152.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY REFERENCE CerrarSam4s  returning Respuesta-Impresor.
  153.  
  154.  
  155. *Send Cerrar        
  156.  
  157.      move spaces       TO FUNC-SAM4-LIB.
  158.      MOVE "IFOpSend"   TO FUNC-SAM4-LIB.
  159.      MOVE 1            TO sWait.
  160.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY VALUE sWait returning Respuesta-Impresor.

Ale 16 de marzo de 2025 18:55

controlador fiscal
 
Hola gente. muchas gracias, voy a probar todo y les cuento..
Si cierre Z los larga bien. El tique también, alcanza a largar descripción del articulo, y luego cuando llega a cantidad larga en cero, o si no el compilador no me deja probar otros Pic...
Fastpho voy a probar también con entero, pero el parámetro por ejemplo (precio), me indica que tiene que ser flotante. No se si lo tomaría, o como hago cuando el valor sea con decimales.
saludos chicos. y eternamente agradecido igual...

fastpho 16 de marzo de 2025 19:23

@Ale, no importan los decimales el impresor va a.poner el pto decimal no te preocupes por eso
Proba como te lo mande , te envía todo
Debería poner precio 1.21 cantidad 5.00
Vamos a probar todos los valores numéricos
Como enteros por ahora ..
Saludos

Ale 16 de marzo de 2025 20:41

controlador fiscal
 
Chicos, le comento que probé las dos opciones que me enviaron.
Kuk probé lo que me enviaste. El compilador no me tira error. Pero en ejecución me cancela el tiquet. Y no imprime mas que descripción.

fastpho probé también lo que me indicaste, y tuvo una notable mejoría, si bien me cancela igual el comprobante, precio unitario le muevo 2200 a la variable y en el tiquet me imprime 22,00. Y le muevo
210 a iva y me imprime en el tiquet 2,10. cantidad le envio 300 y me imprime 0,00. y tambien mejoro en el sentido de que no se cierra el programa. Cosa que antes si.
Una leve esperanza le sigo teniendo al cobol..
Todo comenzó porque tengo que hacer el sistema de facturación nueva. por las nuevas resoluciones de Afip y la leyenda a consumidor finales. Me venia comunicando con el controlador fiscal, con la aplicación (Samdrv.exe) por medio de comandos armados en un archivo de texto... pero resulta que la aplicación por lo que estuve averiguando no tiene ningún comando que permita armar esa leyenda. Llamo a la empresa que lo hizo y no me dan respuesta, se ve que es como pienso yo..
Por eso tengo que hacer todo de nuevo comunicándome por DLL . Tengo tiempo hasta Abril.
Fastpho debes saber de lo que hablo..
Hago todo esto para mi negocio, y como se programar algo de cobol, me largue hacer mis sistemas..
Agradecido eternamente a uds.. y disculpen las molestias.

Kuk 17 de marzo de 2025 10:38

Cita:

Citación del post de Ale (Mensaje 9947)
Kuk probé lo que me enviaste. El compilador no me tira error. Pero en ejecución me cancela el tiquet. Y no imprime mas que descripción.

Es que yo tengo otra versión de PowerCOBOL más reciente... Y tampoco tengo la DLL que utilizas...

Habría que asegurarnos primero de que el problema viene del campo/tipo de campo.

Has probado pasando un valor "en duro", es decir algo así:

Código COBOL:
  1.      ENVIRONMENT     DIVISION.
  2.      DATA            DIVISION.
  3.      WORKING-STORAGE SECTION.
  4.      01  pgm      pic x(10) value "program".
  5.      01  double   comp-1.
  6.      01  num redefines double pic s9(9) comp-5.
  7.      
  8.      PROCEDURE       DIVISION.
  9.          
  10.          call pgm with stdcall using by content "Precio"
  11.                                      by value 1.16

Por cierto, en mi ejemplo de antes se me había olvidado añadir el convenio del call WITH STDCALL, lo mismo el problema viene de ahí.

Prueba otra vez con el convenio (si no lo habías hecho ya):

Código COBOL:
  1.      ENVIRONMENT     DIVISION.
  2.      DATA            DIVISION.
  3.      WORKING-STORAGE SECTION.
  4.      01  pgm      pic x(10) value "program".
  5.      01  double   comp-1.
  6.      01  num redefines double pic s9(9) comp-5.
  7.      
  8.      PROCEDURE       DIVISION.
  9.          
  10.          call pgm WITH STDCALL using by content "Precio"
  11.                                      by value num

Ale 17 de marzo de 2025 13:24

controlador fiscal
 
hola amigos.
Voy a probar enviar el valor en bruto como me decis a ver que pasa.
De la otra forma probé y como comente en el mensaje anterior, no tira error el compilador, pero no funciona.
Descripción, iva, precio unitario enviándolo como Int. en vez de float , algo esta funcionando, no cancela el comprobante, pero no logro que imprima cantidad.
Algo así hago y no toma nada, lo raro que en precio unitario, iva, y los demás valores numéricos los toma.
De todas maneras el manual dice enviar "IFOpParamFloatSet", seguimos en la lucha.
Código COBOL:
  1. move spaces              TO FUNC-SAM4-LIB.
  2.      MOVE "IFOpParamIntSet"   TO FUNC-SAM4-LIB.
  3.      CALL FUNC-SAM4-LIB WITH STDCALL USING BY CONTENT titulo-cantidad
  4.                                            BY VALUE   CantidadSam4
  5.                                            returning Respuesta-Impresor.
Utilizo powercobol 5 , pero tengo version 7, que no la utilice mucho hasta ahora, que opinan? podría probar con esa? tendría que migrar todo el sistema a esa version.
O se podra copartir en la misma pc las dos versiones.?

fastpho 17 de marzo de 2025 13:36

@Ale con el ejemplo que te di te anda ? no esta claro
Código COBOL:
  1. *************************************************************************
  2. * muevo valores necesarios para poder facturar un item o articulo
  3.  
  4.  
  5.      move 1210          TO PrecioSam4. *> 1.21
  6.      move 2100          TO IvaSam4.  *> 21.00
  7.      move 5000          TO CantidadSam4. *> 5000 tiene 3 decimal el impresor tenes que poner 10000 para que te ponga 10.000
  8.      move zeros         TO MontoImpIntFijoSam4.
  9.      move 7             TO UnidadMedidaSam4.  *> este campo le decis tipo unidades

Código COBOL:
  1. *************************************************************************
  2. * muevo valores necesarios para poder facturar un item o articulo
  3.  
  4.  
  5.      move 15260          TO PrecioSam4. *> 15.26
  6.      move 2100          TO IvaSam4.  *> 21.00
  7.      move 15000          TO CantidadSam4. *> 5000 tiene 3 decimal el impresor tenes que poner 15000 para que te ponga 15.000
  8.      move zeros         TO MontoImpIntFijoSam4.
  9.      move 7             TO UnidadMedidaSam4.  *> este campo le decis tipo unidades
Esto para trabajar los campos numericos como IFOpParamIntSet
subi alguna foto del ticket porfa , y con el valor que manda en estas variables
Saludos..

Ale 17 de marzo de 2025 13:49

controlador fiscal
 
fastpho si si funciona, pero el único que no funciono es el de cantidad. No se porque.
si envio como el ejemplo : IFOpParamIntSet a la tarde subo foto de tique, no lo tengo a mano aca.

Kuk 17 de marzo de 2025 13:58

@Ale, "int" es el tipo Integer, que viene a ser de tipo entero, no te vale para valores con decimales.

La verdad es que no sé qué diferencia hay entre la v5 y la v7. Lo interesante sería, probar mi ejemplo con BINARY-LONG en la v7 y ver si lo acepta. No obstante, aunque el compilador coja esta definición, no garantiza que vaya a funcionar.


No se puede tener 2 instancias NetCOBOL/PowerCOBOL instaladas en el mismo SO. Puedes pasar por otro PC o una VM.


La franja horaria es GMT +2. Ahora son las 16:22.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.