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)

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 15:44.

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