Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Sintaxis] Ayuda para interactuar con base de Datos (https://www.cobolforo.es/showthread.php?t=143)

Breew 1 de junio de 2015 18:58

Ayuda para interactuar con base de Datos
 
Hola.

Tengo un fichero en c:\nshop\datos.mdb que me gustaria poder procesarlo.
En el se encuentra la tabla Articulos, de la cual , necesitaria ir controlando el stock para poder hacer pedidos, inventarios, etc.

He visto que en Los ejemplos de power esta el proyecto DbAccess, pero no tengo ni idea de poder hacerlo funcionar y tampoco se si me iria bien.

Supongo que deberia crear desde windows u origen de datos, pero no lo he hecho nunca y voy muy perdido.
Tambien veo que igual deberia de hacerlo desde el control powerDBaccess, pero ni idea.

Hay alguien que me puede hacer un pequeño tutorial para conseguir abrir la base y poderla leer.

Gracias

Kuk 1 de junio de 2015 21:18

Breew, yo tampoco lo he hecho nunca. Pero se algunas cosas. Debes meter un DBaccess como decias, y en modo diseño conectarlo a la BBDD esa de access. Es decir, abres las propiedades de DBaccess con doble click, buscas origen de datos correspondiente a Access, y sigues los pasos para recuperar la tabla y su estuctura.

Hrmcobol 2 de junio de 2015 03:24

Hola Breew, mándame una copia de la base y te armo un ppj que lea y actualice la tabla de artículos

Saludos

Hrmcobol 2 de junio de 2015 13:08

1 Archivos Adjunto(s)
Hola Breew, te adjunto un zip con un ppj que lee una base access con una tabla de materiales, también va un jpg con la odbc que debes crear, una base con datos. Si tiene algún error avísame y lo vemos. Saludos espero que te sirva. Si no dime y la seguimos.


PD. Crea una carpeta en C: que se llame C:\MF_Breew



Saludos

Breew 4 de junio de 2015 07:55

Hola.

Veo que debo de configurar DNS de sistema, pero me parece que me faltan drivers. Solo me aparece la opcion de SQL Server y de ahi no paso.
¿No has tocado nada de dns de Usuario ?



Cita:

Citación del post de Hrmcobol (Mensaje 628)
Hola Breew, te adjunto un zip con un ppj que lee una base access con una tabla de materiales, también va un jpg con la odbc que debes crear, una base con datos. Si tiene algún error avísame y lo vemos. Saludos espero que te sirva. Si no dime y la seguimos.


PD. Crea una carpeta en C: que se llame C:\MF_Breew



Saludos


Hrmcobol 4 de junio de 2015 12:37

1 Archivos Adjunto(s)
Que Windows Tinenes, si es Win7 64 Busca Aqui:

C:\Windows\SysWOW64\odbcad32.exe

Breew 5 de junio de 2015 07:55

Cita:

Citación del post de Hrmcobol (Mensaje 657)
Que Windows Tinenes, si es Win7 64 Busca Aqui:

C:\Windows\SysWOW64\odbcad32.exe

Ok, vaya despiste.
Conecta sin problemas, puedo leer la tabla, pero cuando actualizo, entiendo que deberia grabar el valor nuevo, pero no lo hace.

Tambien tengo dudas sobre como deberia planificarme, tengo poca experiencia.
He pensado hacer una busqueda por familias, o por proveedores. Ver el stock y ajustarlo para hacer el pedido.
Lo hago directamente sobre la base o paso los resultados a un Table control ?
La busqueda la hago por cobol o bien hay algun comando especial en DB ?
La base tiene 16.000 articulos, ya que es una base antigua, y cuando habro el fichero contiene varias tablas, Como le indico que tabla ha de buscar ?


Gracias por todo.

Breew 6 de junio de 2015 13:55

Hola.

Estoy probando con una base dbf.
He hecho la conexion bien, y lee la tabla correctamente.
El problema lo encuentro al hacer una comparacion con la fecha.

Si vuelco el valor de la base en un cmtext me aparece formato yyyy/mm/dd.

He creado un cmtext para iniciar la busqueda y me aparece el error de power cobol db access control indicandome que no coinciden los tipos de datos en la expresion de criterios.

¿ Que formato le indico al CmText para que funcione la comparacion?

PD. En la seleccion del campo en el control power db access me indica el formato yyyy/mm/dd pero no funciona en el cmtext

Saludos.

Kuk 6 de junio de 2015 20:33

Cita:

Citación del post de Breew (Mensaje 677)
He creado un cmtext para iniciar la busqueda y me aparece el error de power cobol db access control

A qué te refieres con lo de "iniciar la búsqueda"??? :piensa:
De todoso modos, si he entendido bien la pregunta, si le pones "RenderText" al CmText, indica "yyyy/MM/dd" con MM en mayúsculas y te mostrará las fechas en el formato que necesitas.

Hrmcobol 6 de junio de 2015 23:45

Amigo, yo muevo el "Text" del CmText a un pic 9(8). lo mismo hago, si es que me lo permite el campo de la db, y luego los comparo, o bien los trabajo de acuerdo a mi necesidad.

Saludos

PD.: espero te sirva

Breew 7 de junio de 2015 21:37

Cita:

Citación del post de Kuk (Mensaje 679)
A qué te refieres con lo de "iniciar la búsqueda"??? :piensa:
De todoso modos, si he entendido bien la pregunta, si le pones "RenderText" al CmText, indica "yyyy/MM/dd" con MM en mayúsculas y te mostrará las fechas en el formato que necesitas.

Hola kuk.

Mi intencion es iniciar una busqueda por fechas . Lo interpreto como si fuera un fichero cobol indexado, es decir
Siguiendo el ejemplo de Hrmcobol
Código COBOL:
  1.     move "Text" OF Cm-CODIGO to wl-codigo
  2.      
  3.      string "CLICODIGO = '" DELIMITED BY SIZE
  4.              WL-CODIGO       DELIMITED BY SIZE
  5.             "'"              DELIMITED BY SIZE
  6.        into wl-condi
  7.      end-string
  8.  
  9.      move SPACES   to "Condition" OF CmDb1
  10.      move wl-condi to "Condition" OF CmDb1    
  11.      
  12.      INVOKE CmDb1 "SelectRecords" RETURNING ReturnValue

Aqui , funciona correctamente y cuando leo un registro , la fecha me aparece con formato yyyy/MM/dd



Código COBOL:
  1.      move "Text" OF Cm-FECHA2 to wl-codigo
  2.      
  3.      string "FECHA = '"        DELIMITED BY SIZE
  4.              WL-CODIGO       DELIMITED BY SIZE
  5.             "'"              DELIMITED BY SIZE
  6.        into wl-condi
  7.      end-string
  8.  
  9.      move wl-condi to "Condition" OF CmDb1    
  10.      
  11.      INVOKE CmDb1 "SelectRecords" RETURNING ReturnValue

El problema es que si quiero buscar fechas aunque el cmtext CmFecha-2 tenga un render yyyy/MM/dd me aparece un error en tiempo de ejecucion SQL error State 22005 native error code
Controlador ODBC dBase No coinciden los tipos de datos en la expresion de criterios.

Interpreto que es porque en la base el formato solo especifica D , y no puede comparar la busqueda por que yo lo intento con yyyy/MM/dd.
Tambien lo he probado de varias maneras , pero sigue dandome error.

En resumen lo que quiero hacer es poder interrogar la base de datos y quedarme o pasar una tabla cobol ( o fichero , o lo que sea ) los datos que cumpran la condicion para procesarlos. En este caso por fechas.

Saludos

Añadido despues de 5 minutos
Cita:

Citación del post de Hrmcobol (Mensaje 681)
Amigo, yo muevo el "Text" del CmText a un pic 9(8). lo mismo hago, si es que me lo permite el campo de la db, y luego los comparo, o bien los trabajo de acuerdo a mi necesidad.

Saludos

PD.: espero te sirva


Je, je, je , siempre sirven vuestras enseñanzas. Inicialmente lo que habia pensado hacer es leer toda la base dB y grabarla a un fichero cobol indexado. Proceso y supongo que todo me podria salir mas o menos correctamente.
Pero pienso que realmente no se haria asi, Lo suyo seria actuar directamente sobre la base ( creo ) por esto os comentaba que no se como plantearme este reto, mi pensamiento sigue trabajando en el Rmcobol Dos, quisiera cambiar un poco el chip y aprender a trabajar de otra manera.

Saludos

Kuk 8 de junio de 2015 10:05

Breew, la propiedad "Text" en un CmText obtiene valor sobre 8 en numérico, no coge los guiones/barras. Si en la tabla, el campo de la fecha lo tienes definido como DATE, no va a funcionar. Porque, que yo sepa, el tipo DATE en una tabla siempre lleva separadores, cual exactamente depende del formato. Por ejemplo el formato ISO es AAAA-MM-DD. Si le pones barras "/", va a dar error de formato.

Dicho esto, revisa el formato definido en la tabla. Y sea como sea que muestres las fechas en CmText, con STRING construye el formato de fecha esperado por la BBDD. Así no te dará error. ;)

Breew 11 de junio de 2015 23:02

Hola.

He seguido tus instrucciones y he salvado el error, pero no me funciona, no encuentro el fallo.
Quizas no sepa bien como actua.
Mi intencion es que haga la seleccion por fechas , le indico una fecha minima y quisiera que se situara en ella. A partir de ella , me hiciera un avance al siguiente registro que cumpliera el mismo requisito.

Código COBOL:
  1.  
  2.  ENVIRONMENT     DIVISION.
  3.  DATA            DIVISION.
  4.  WORKING-STORAGE SECTION.
  5.  01  wl-codigo  pic x(010).
  6.  01  wl-condi   pic x(050).
  7.  01  FECHA.
  8.       02 AÑO        PIC X(4).
  9.       02 MES        PIC X(2).
  10.       02 DIA        PIC X(2).
  11.  01  FECHA-2       PIC X(10).
  12.  
  13.  PROCEDURE       DIVISION.
  14.      move spaces to wl-condi.
  15. *     move "Text" OF Cm-FECHA2 TO FECHA.
  16. *             STRING AÑO "/" MES "/" DIA DELIMITED BY SIZE
  17. *                into FECHA-2.
  18. *              MOVE FECHA-2 TO "Text" OF Cm-FECHA3.
  19. *     MOVE FECHA-2 TO WL-CODIGO.
  20. *     move wl-codigo  TO "Text" OF Cm-FECHA3.
  21. *     string "FECHA  >= '"      DELIMITED BY SIZE
  22. *             WL-CODIGO       DELIMITED BY SIZE
  23. *            "'"              DELIMITED BY SIZE
  24. *            into wl-condi.
  25.  
  26. *  aqui le meto la fecha a la fuerza para ver si chuta
  27.        move "FECHA > 2014/08/30" to wl-condi.
  28. *     end-string
  29.  
  30.      move SPACES   to "Condition" OF CmDb1
  31.      move wl-condi to "Condition" OF CmDb1    
  32.      
  33.      INVOKE CmDb1 "SelectRecords" RETURNING ReturnValue
  34.      if ReturnValue < zeros
  35.         INVOKE pow-self "DisplayMessage" USING "Atencion" "Codigo No Existe" 0
  36.                exit program.
  37.      INVOKE CmDb1 "ReadNextRecord" RETURNING ReturnValue
  38.      if ReturnValue = 1
  39.         move "FECHA"        of CmDb1 to "Text" OF Cm-FECHA
  40.         move "CLICODIGO"    of CmDb1 to "Text" OF Cm-Clicodigo
  41.         move "NOMBRE"       of CmDb1 to "Text" OF Cm-Nombre
  42.         move "TOTAL_FRA"    of CmDb1 to "Text" OF Cm-Total_fra
  43.         move "N_FACTURA"    of CmDb1 to "Text" OF Cm-n_factura
  44.         ELSE DISPLAY RETURNVALUE
  45.      end-if        

Se posiciona en una fecha erronea :-¿?
Y el avance de registro no funciona.

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  wl-codigo  pic x(010).
  5.  01  wl-condi   pic x(050).
  6.  PROCEDURE       DIVISION.
  7.  
  8.      INVOKE CmDb1 "ReadNextRecord" RETURNING ReturnValue
  9.      if ReturnValue = 1
  10.         move "FECHA"        of CmDb1 to "Text" OF Cm-FECHA
  11.         move "CLICODIGO"    of CmDb1 to "Text" OF Cm-Clicodigo
  12.         move "NOMBRE"       of CmDb1 to "Text" OF Cm-Nombre
  13.         move "TOTAL_FRA"    of CmDb1 to "Text" OF Cm-Total_fra
  14.         move "N_FACTURA"    of CmDb1 to "Text" OF Cm-n_factura
  15.      end-if    
Cita:

Citación del post de Kuk (Mensaje 686)
Breew, la propiedad "Text" en un CmText obtiene valor sobre 8 en numérico, no coge los guiones. Si en la tabla, el cahmpo de la fecha lo tienes definido como DATE, no va a funcionar. Porque, que to sepa, el tipo DATE en una tabla siempre lleva separadores, depende del formato. Por ejemplo el formato ISO es AAAA-MM-DD. Si le pones barras "/", va a dar error de formato.

Dicho esto, revisa el formato definido en la tabla. Y sea como sea que muestres las fechas en CmText, con STRING construye el formato de fecha esperado por la BBDD. Así no te dará error. ;)


Kuk 12 de junio de 2015 09:47

Breew, lo que yo te decía, que mirases cómo tienes definido el campo FECHA en la tabla de la base de datos, no en tu código COBOL. Además:
Cita:

Citación del post de Kuk (Mensaje 686)
Por ejemplo el formato ISO es AAAA-MM-DD. Si le pones barras "/", va a dar error de formato.

Y en tu código tienes "/" en vez de "-".

Prueba con:

Código COBOL:
  1.          STRING AÑO "-" MES "-" DIA
  2.              DELIMITED BY SIZE INTO FECHA-2.

Por cierto, te compila con la Ñ ¿?!!! :) Nunca lo había probado.

Ya me contarás ;)

Breew 13 de junio de 2015 00:33

Hola Kuk.

Cita:

Citación del post de Kuk (Mensaje 702)
Breew, lo que yo te decía, que mirases cómo tienes definido el campo FECHA en la tabla de la base de datos, no en tu código COBOL. Además:

Y en tu código tienes "/" en vez de "-".

Prueba con:

Código COBOL:
  1.          STRING AÑO "-" MES "-" DIA
  2.              DELIMITED BY SIZE INTO FECHA-2.

Si, lo entendi . En la base de datos, unicamente encuentro que tiene formato d y si lo busco en un editor hexadecimal lo veo como yyyyymmdd.
En la definicion del CmDb1 en FIELDS, el campo fecha lo detecta con formato yyyy/mm/dd. y en ejecucion , tanto con formato separado con guion o barra, no me da error de formato, simplemente se posiciona en el primer registro fisico de la base. Pero lo hace sin cumplir la condicion de que sea mayor que la fecha que le indico. No tengo ni idea del motivo porque no se posiciona segun la posicion.

Quisiera adjuntaros la base, pero es excesivamente grande, y no tengo ninguna herramienta para editarla y poderos enviar algun registro grabado.

Cita:

Citación del post de Kuk (Mensaje 702)
Por cierto, te compila con la Ñ ¿?!!! :) Nunca lo había probado.

Ya me contarás ;)

Si , compila con la ñ sin problemas. Utilizo el power Cobol 9.0 Sobre windows 7 .
Por cierto la base dbf esta hecha bajo programacion del FoxPro 6.0

Hrmcobol 13 de junio de 2015 13:04

Hola Amigo, que tan grande es la base, no la puedes bajar a un DropBox?.

saludos

Breew 16 de junio de 2015 22:24

Hola.

He limpiado la base de datos personales y la he subido a un dropbox.

Si alguien quiere echarle un vistazo a ver porque no proceso las fechas por favor que me envie un privado y le doy las señas.

Muchas gracias .

Rapinto 22 de junio de 2015 15:44

Breew,

Tenta o seguinte SQL

Código SQL:
  1. "SELECT * FROM FACTURA1 WHERE [FECHA] between #1/02/2003 12:00:00 AM# and #1/02/2003 12:00:00 AM# ;"

Atenção que o formato da data é MM/DD/AAAA

Espero que resolva

Saludos,
Rui Pinto

Recato53 28 de enero de 2016 19:03

1 Archivos Adjunto(s)
Cita:

Citación del post de Hrmcobol (Mensaje 628)
Hola Breew, te adjunto un zip con un ppj que lee una base access con una tabla de materiales, también va un jpg con la odbc que debes crear, una base con datos. Si tiene algún error avísame y lo vemos. Saludos espero que te sirva. Si no dime y la seguimos.


PD. Crea una carpeta en C: que se llame C:\MF_Breew



Saludos

Estoy usando tu ejemplo con tu Base de Datos y no tengo problemas en conectarme, pero cuando lo intento con otra Base de Datos no hay manera de conectarme. Envio un ejemplo de la Base de datos, para ver donde puede estar el problema.

Muchas gracias.

Dasije 28 de enero de 2016 22:46

Al mover los valores, utilizar mascara PIC 9999/99/99.

Yo tengo desarrollado unas rutinas para "descomponer" la mascara que recibe de la base de datos y volcarla a una variable PIC 9(8) en el orden que quiero que se muestre.


La franja horaria es GMT +2. Ahora son las 04:24.

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