• Sábado 25 de Mayo de 2024, 07:30

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - xodrf

Páginas: [1] 2
1
Visual FoxPro / EJEMPLO ABM EN FOXPRO CON MYSQL!!
« en: Miércoles 7 de Abril de 2010, 19:31 »
Bueno aca envio un ejemplo para los que estan iniciando en desarrollo cliente-servidor para que no les cueste tanto como a mi que apenas estoy iniciandome en el tema :beer:

2
Visual FoxPro / Re: Visual fox cliente servidor
« en: Miércoles 3 de Febrero de 2010, 14:11 »
Buscar todos los fomularios en los que uses ZAP, PACK, sobre tablas compartidas y quita estas sentencias pon SET EXCLUSIVE OFF en tu programa principal y cambia las sentecias USE ... EXCLUSIVE por USE ... SHARED y/o USE ... SHARED NOUPDATE, te sugiero que crees una clase qustom para apertura de tablas busca en este foro la definicion de una clase _XioNet esta te facilita la apertura de tablas en red y devuelve .T. o .F. si falla con el que puedes comprobar casos de errores de acceso, ten en cuenta que debes comprobar y/o informarte bien sobre bloqueos de registro sobre todo si utilizas un sistema de facturacion con varias terminales simultaneas para obtener el nro de factura exclusivo (o sea no repetido), si buscas en este foro tambien existe discusión sobre el tema. Suerte!

3
Visual FoxPro / Re: impresion de de datos de un form
« en: Miércoles 3 de Febrero de 2010, 13:26 »
Lo que puedes hacer es copiar los registros del combo en un cursor o tabla e imprimirlo o quizas podrias copiarlo a una matriz e imprimirlo pero igual necesitas que por lo menos una tabla este abierta, es decir haces un bucle y copias registro por registro de tu combo a una matriz, tabla, o cursor y luego llamas a tu reporte basandote en los registros copiados.

4
Visual FoxPro / Re: programa en red-inconsistencias
« en: Sábado 31 de Octubre de 2009, 01:58 »
Caramba me sorprendiste desprevenido bueno te cuento que debo dar un repaso al tema de buffers y sobre todo a la clase Picbtns1.addRec() que llama a otro formulario que pregunta algo como Agregar registro al encabezado o detalle o ambos,  que es la responsable del problema suponiendo que el problema esta en los formularios de facturacion CCF Y CCF1 y que las tablas en las que se agregan registro son ccf.dbf y ccfdet.dbf. bueno te digo como deberia funcionar mientras para que trates de asimilarlo y por alli vayas pensando en alguna solucicion mientras yo estudio el codigo, al momento de agregar un registro suponiendo que idccf debe ser autoincremental y exclusivo y cuyo indice activo sea idccf (o sea que debe ser autonumerico y no debe coincidir con ninguno nro nuevo que otro usuario pueda agregar simultaneamente) el primer paso debe ser bloquear el fichero contra escritura con FLOCK() asi nos aseguramos que en este momento solo un usuario puede escribir en la tabla ccf.dbf vamos al final del fichero con GO BOTTOM y obtenemos el ultimo idccf+1 que el siguiente identificador valido,  insertamos el registro y los datos correspondiente como idcliente, nombre etc  y luego liberamos el bloqueo sobre la tabla con UNLOCK a estas alturas ya tienes un nro valido de idccf y seguro que no coincide con uno nuevo que un usuario simultaneo pueda estar generando, posteriormente a esto debes seguir con el llenado de datos en ccfdet.dbf que no tiene ninguna relevancia a este caso.
Ahora tu gran problema es que trabajas con buffers y francamente ahora no tengo idea de como puedes solucionar este problema manteniendo asi como esta, salvo agregar una tabla ccfheader.dbf en la que tengas una lista de todos los idccf que vayas generando y no lo abras con buffers de modo a usar esta para obtener idccf en lugar de ccf.dbf espero haberme explicado si no mi correo empieza por xodrf y mi proveedor de correo es hotmail o sea @hotmail.com

Pd: Logre reproducir la falla haciendo lo siguiente lanza dos veces el programa (EXE) ingresa a la pantalla ccf agrega un nuevo registro (ambos) mete idccf 201, ve la la segunda instancia e ingresa a ccf agrega un nuevo registro (ambos) mete idccf 201 y graba ambas instancias veras como te duplica los registros con idccf 201 en ambas tablas ccf.dbf y ccfdet.dbf que es donde ocurre la combinacion de registros de ambos usuarios, debes tratar de obtener el idccf de manera automatica y no pidiendo al usuario que es como te sugeri arriba, mediante algo asi:

*//   BUSCANDO UN NUEVO IDCCF EXCLUSIVO
SELECT CCF
GO BOTTOM
DO WHILE !FLOCK()
       MESSAGEBOX( [ESPERANDO EL DESBLOQUEO DEL FICHERO CCF.DBF], 16, [FLOCK] )
ENDDO
_idccf=IDCCF+1
INSERT INTO CCF (IDCCF,...) VALUES (_idccf,...)
UNLOCK
*// ARCHIVO LIBERADO, OTROS USUARIOS AHORA PUEDEN GRABAR EN EL

5
Programación de Aplicaciones para Dispositivos / Re: Algo de informacion
« en: Viernes 30 de Octubre de 2009, 13:15 »
Veo que estamos en las mismas actividades yo tambien estoy intentando aprender php, pero primero debes tener preparado tu servidor yo lo tengo hecho en fedora 10 y ya les estoy dando a las practicas, debes instalar primero el linux, luego el servidor http, activar el paquete php sobre http e instalar algun motor de base de datos como por ejemplo mysql no es facil pero con muchos click y googleos y varias horas de lectura todo tiene solucion. :beer:

6
Visual FoxPro / Re: programa en red-inconsistencias
« en: Jueves 29 de Octubre de 2009, 15:40 »
Bueno no posteaste el codigo pero estoy casi seguro que tu problema se da cuando ambos usuarios graban los datos simultaneamente y obtienen el mismo numero de comprobante, postea tu codigo para poder verificar y o tratar de ayudarte.

De todos modos te recomiendo bloquear la tabla y no el registro al momento de obtener el nro de comprobante.

7
Clipper / Re: Ingreso de datos en redes
« en: Domingo 25 de Octubre de 2009, 19:50 »
DATO: la funcion dbcommit() lo unico que hace es forzar la grabacion de datos del buffer al disco duro, es decir si tu abres una tabla con un campo con seis bytes insertas unos 1000 a 1500 registros y cierras la aplicacion con taskmanager o directamente reinicias la pc o se corta la energia, te encontraras con la sorpresa de que ningun registro se grabo claro que esto depende de la maquina a mas memoria mas grande el cache, y con esta funcion le obligas al sistema a grabar esos registros ya sea para la tabla seleccionada en el caso de dbcommit() o para todas las tablas en el caso de dbcommitall(), mismo funcion flush() para ficheros abierto con funciones de bajo nivel como fopen(),fclose() etc. Espero aber ayudado

8
Visual FoxPro / Re: Totales Dificiles en Reporte Contable
« en: Lunes 28 de Septiembre de 2009, 15:53 »
Solo si tu plan de cuentas esta agrupada de a dos cifras es decir con 12 digitos 1.01.01.01.001 te doy otra idea: cambia el orden de tus cuentas cuando la recorras es decir empieza por el final
101030101002  CLIENTE 2                              
101030101001  CLIENTE 1                              
101030101       ** CLIENTES SECCION REPUESTOS **
1010301           ** CLIENTES CASA CENTRAL **            
10103              ** CREDITOS **                          
10102              ** INVERSIONES TEMPORARIAS **          
1010104           ** OTROS VALORES **                    
101010301001  BANCO XXX CTA 00                        
101010301       ** BANCOS CASA CENTRAL **              
1010103           ** BANCOS **                            
101010101003  CAJA MONEDAS EXTRANJERAS                
101010101002  RECAUDACIONES A DEPOSITAR              
101010101001  CAJA MONEDA NACIONAL                    
101010101       ** CAJAS CASA CENTRAL **                
1010101          ** CAJAS **                            
10101             ** DISPONIBILIDADES **                  
101                 ** ACTIVO CORRIENTE **                  
1                    ** ACTIVO **                            

** Las cuentas que empiezan por asterisco, son de solo titulo, no imputable, cta integradora y no se que otros nombres se le da.
Con dos bucles anidados podrias sumar los importes de las cuentas hijas
DO WHILE !EOF()
       
        _cuenta=CUENTA   &&cuenta en la que comienza
        _level   =LEN(ALLTRIM(CUENTA))
       
        * suma todas las cuentas que tengan el mismo nivel
        DO WHILE !EOF() AND LEN(ALLTRIM(CUENTA))==_level
                 ...
                 SKIP +1
        ENDDO
        grabas el monto en la cuenta titular y pasas al siguiente segmento de cuenta

ENDDO
etc.
Ten en cuenta este q tipo de situaciones te puede dar un error o sea que no exista una cuenta integradora para un grupo de cuentas (falta la integradora 101010301 ** BANCOS CASA CENTRAL **), este caso debes tratar de mostrar un error o algo asi.

101010301001  BANCO XXX CTA 00                        
1010103           ** BANCOS **                            
Ojala superes el problema!! :mellow:

9
Visual FoxPro / Re: Enviar texto por el purto COM1
« en: Lunes 28 de Septiembre de 2009, 15:11 »
Yo creeria que te quedan dos opciones:
1) La facil: ponerte en contacto con el fabricante del display y obtener los bytes con los que se acompaña el texto a mostrar.
2) La mas complicada: cargar el soft del fabricante en un computador y conectarla a otro con un cable serial y por medio del vfp u otro capturar todos los bytes que llegan al com enviados por el soft del fabricante para inspeccionarlo, que en caso de que no sea una comunicacion muy controlada (es decir envia unos byte el display responde con otros envia otros bytes y el display responde con otros) seria de un solo envio, es un poco tedioso pero no imposible.
Osea lo que tu debes buscar son los bytes se envian al display y si el display responde con otros para determinar si existe algun error en el estado de la conexion para posteriormente transmitir el texto.
Esto suponiendo que sabes comunicarte a traves del serial, si no busca info.

10
Visual FoxPro / Re: Salto de Pag NO FUNCIONA
« en: Sábado 12 de Septiembre de 2009, 16:10 »
Me supongo que lo que quieres hacer es imprimir tus recibos en los formularios troquelados que vienen con una
longitud de la mitad de 11" y con una impresora epson? si es asi pues:
1- Te recomiendo fuertemente que reemplaces tus @ SAY por ??? "TEXTO"+CHR(13)+CHR(10)
2- aca va el ejemplo de como yo lo hago
_cbig=CHR(18)+CHR(14)
_cmbi=CHR(15)+CHR(14)
_csma=CHR(18)+CHR(15)
_cnor=CHR(18)
_cbig=CHR(18)+CHR(14)
_eol =CHR(13)+CHR(10)
??? _eol
??? _cbig+[* LIQUIDACION DE SALARIOS (Art.xxx) *]+_eol+_eol
??? _cmbi+[Empleador ]+_ename+[ N. Patronal ]+SECCION.NPATRON+_eol
??? _cmbi+[Trabajador ]+STRTRAN(CODIGO," ","0")+"-"+CPCONVERT(1252,437,NOMBRE)+_cnor+_eol
??? _cnor+[Periodo ]+_Xper+[ L.]+STRTRAN(_ncompr," ","0")+_cnor+_eol+_eol
*... un largo etcetera intermedio
??? [FECHA DE PAGO: ]+DTOC(_fpago)
??? SPACE(54)+[...............................]+_eol
??? SPACE(80)+[            FIRMA              ]+_eol+_eol+_eol+_eol+_eol+_eol
*//
*//      FIN DEL RECIBO, SE SUPONE QUE SE HA IMPRESO Y/O AVANZADO 34 LINEAS con _eol(end-of-line)
*//
??? CHR(27)+
  •          &&este es el comando de inicializacion de impresora epson matricial lx-300

_plineno=0            &&seteamos el contador de linea
_pcolno =0            &&seteamos el contador de columna
Pero yo activo la impresora una vez he imprimo todos los recibos y recien alli lo desactivo y a mi me funciona correctamente te recomiendo fuertemente que leas exaustivamente el manual de tu impresora alli hay informacion valiosa que la mayoria de los programadores ignoran.

 B)

*******************************************************************************************************
*Estas tres lineas siguientes debes agregar a tu codigo para que simule un saldo de pagina
*y no usar EJECT, ojo luego de avanzar hasta la ultima linea de la hoja!!!!
*??? CHR(27)+
  •          &&este es el comando de inicializacion de impresora epson matricial lx-300

*_plineno=0            &&seteamos el contador de linea
*_pcolno =0            &&seteamos el contador de columna
*******************************************************************************************************


3- Ahora la pregunta del millon porque te recomiendo fuertemente que reemplaces tus @ SAY por ??? pues corre
estas sentencias desde un prg en el fox y verificaras la potencia de manejar la impresora a tu antojo

_picl1=   CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(142)+CHR(207)+CHR( 79)+CHR( 15)+CHR(159)+;
      CHR(223)+CHR( 95)+CHR(159)+CHR(223)+CHR(223)+CHR( 80)+CHR( 16)+CHR(208)+CHR(208)+CHR( 16)+;
      CHR(208)+CHR(208)+CHR( 16)+CHR(208)+CHR(208)+CHR( 16)+CHR(210)+CHR(215)+CHR( 23)+CHR( 87)+;
      CHR(210)+CHR(128)+CHR(  0)+CHR( 64)+CHR(192)+CHR(128)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)
_picl2=   CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(128)+CHR(128)+CHR(128)+;
      CHR(128)+CHR(128)+CHR(136)+CHR(140)+CHR( 12)+CHR( 12)+CHR(  4)+CHR(  4)+CHR(  4)+CHR(132)+;
      CHR(196)+CHR(196)+CHR(132)+CHR(  4)+CHR(  4)+CHR(  4)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+;
      CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)+CHR(  0)

#define _sendtoprint      

#ifdef _sendtoprint
SET CONSOLE OFF
_printer=GETPRINTER()
IF EMPTY( _printer )
   MESSAGEBOX( [PRINT CANCEL!], 64, [WARNING!] )
   RETURN .F.
ENDIF
#endif
#ifndef _sendtoprint
   SET PRINTER TO FILE [SALIDA.TXT] ADDITIVE
   SET PRINTER ON TO PROMPT
#else
   SET PRINTER TO NAME (_printer)
#endif
SET DEVICE TO PRINTER
??? CHR( 18)+CHR( 15)
??? CHR( 27)+CHR( 89)+CHR( 40)+CHR(  0)+_picl1+" un saludo cordial desde:"+CHR(27)+CHR(74)+CHR(24)+CHR(13)
??? CHR( 27)+CHR( 89)+CHR( 40)+CHR(  0)+_picl2+" Encarnacion-PARAGUAY"+CHR(27)+CHR(74)+CHR(24)+CHR(13)
??? CHR( 27)+CHR( 74)+CHR( 24)+CHR( 13)
SET PDSETUP TO
SET PRINTER OFF
SET DEVICE TO SCREEN
SET CONSOLE ON
SET PRINTER TO 'LPT1'
RETURN .T.
 B)

11
Visual FoxPro / Re: Funcion de Limpiar después de un reporte
« en: Miércoles 9 de Septiembre de 2009, 20:58 »
si es el famoso C0000005 pues busca en google hay muchas causas para este error!!!, ahora si es error de excepcion o sea pantallita celeste con letras blancas que generalmente se dan en win98 es muy probable que error se deba al driver de tu impresora!!

12
Visual FoxPro / Re: Problema con Grid
« en: Viernes 4 de Septiembre de 2009, 15:55 »
PRUEBA ENLAZAR CADA CAMPO DE TU GRID CON LA TABLA ES DECIR
THISFORM.GRID1
     .RECORDSOURCE="MITABLA"
     .COLUMN1.CONTROLSOURCE="MITABLA.CAMPO1"
     .....
     .COLUMNN.CONTROLSOURCE="MITABLA.CAMPON"
ENDWITH
Y NO TE OLVIDES QUE CUANDO TU GRID RECIBE EL FOCO LA TABLA A LA QUE APUNTA GRID DEBE ESTAR SELECCIONADA
PREVIAMENTE (CON SELECT MITABLA)

13
Visual FoxPro / Re: ACTUALIZAR UNA TABLA COMPARTIDA EN RED
« en: Lunes 31 de Agosto de 2009, 16:15 »
Bueno para todos aquellos que esten interesados en aprender y no en criticar algo que nisiquiera comprenden les voy a explicar como yo resolvi esto: tenemos una tabla cabecera de factura y otra detalles y otras relacionadas, uno no puede obtener el nro de comprobante en el momento de cargar un formulario y/o antes de apretar el boton grabar, porque digo esto pues si el usuario1 carga el formulario y obtiene el nro 10 y simultanemente el usuario2 obtendria el nro 11 (suponiendo que se autoincremente correctamente los nros) ¿y que pasa si el usuario1 no desea grabar su factura y el usuario2 si?, pues simple te saltaria la numeracion de la factura 9 saltaria al 11 (en el caso de que la numeracion sea automatica estarias ante un error de numeracion).
Como yo imprimo la factura en un comprobante contable este debe concidir con el nro preimpreso, por tanto yo lo hice asi
DFAC   &&DETALLE DE FACTURA NO TIENE IMPORTANCIA PARA ESTA EXPLICACION

CFAC   &&CABECERA DE FACTURA
NCOMPR  CODCLI            FECHA ...        OTROS CAMPOS
000001    101030101001  30/12/2008    
000002    101030101002  30/12/2008
....
000100    101030101025  30/12/2008

Yo obtengo el nro asi: bloqueando el fichero CFAC con FLOCK() y enviando el puntero al final GO BOTTOM entonces capturo el ultimo nro y lo sumo 1 en este caso es mediante _ncompr=STR( VAL(NCOMPR)+1, 6, 0 ) y este numero yo se que es seguro porque al hacer FLOCK ningun otro proceso y/o usuario puede modificar ni agregar registros a CFAC en cambio si lo hago con RLOCK() este no impide que se sigan agregando registros/numeros al final ya que este solo impide que escribas en el registro bloqueado, una vez obtenido el sgte nro posible lo muestro al usuario y pido su confirmacion este puede aceptar o cambiar por otro en el caso de que la hoja preimpresa fuera dañada y/o usado para otros menesteres dicho comprobante y/o haya hecho a mano la factura y deba ingresarlo luego (hay muchos casos de estos), si el usuario acepta se da de alta el registro con el nuevo nro y se libera el FLOCK, si el usuario cambio el nro obtenido por uno siguiente o anterior reviso la tabla para certificar que no existe el comprobante para no duplicarlo y lo grabo, en caso que exista ya el comprobante vuelvo a pedirle al usuario el nro de comprobante, recien alli cuando se haya grabado el segundo usuario puede tratar de obtener el sgte nro posible, funciona perfectamente.

Como referencia dejo sentado que solo un usuario y/o proceso puede bloquear una tabla con FLOCK de modo que esto asegura que en la grabacion simultanea de facturas no exista conflicto de nros de comprobantes.

Luego de obtener el nro de comprobante procedo a hacer los registros en la ficha de movimiento, grabado en detalle de factura, descuento de stock y registros de asientos contables entre otras actualizaciones.

y para el amigo malamigo que esta muy preocupado por los cortes de luz, ningun sistema esta exento de fallo sobre todo los que utilizan motor de base de datos en el servidor, peeeero los capos en electronica proveen algo llamado UPS que esta al alcance de cualquier micro empresa ya sea para el servidor, switcher y las terminales, si no te gusta esa solucion pues informate sobre campos en la cabecera de las DBF'S  para aprender como repararla, yo te cuento hace tiempo estoy en esto y a lo sumo se dañan los CDX pero poquisimas veces y generalmente cuando tienen problemas en superficie del disco :no:

14
Visual FoxPro / Re: ACTUALIZAR UNA TABLA COMPARTIDA EN RED
« en: Domingo 23 de Agosto de 2009, 06:27 »
Bueno he revisado una y mil veces y no entiendo de que hablan cuando dicen que sumo +1 al nro de registro ... bueno supongo que es algo muy complejo para mi corto conocimiento yo almaceno el nro de comprobante en un campo char y lo convierto a val para poder calcular el sigte. nro de comprobante y lo vuelvo a pasar a char para almacenarlo a mi me funciona, lo que pasa es que quizas no me exprese bien, pero no importa no pienso perder mas mi tiempo tratando de ayudar :bad:

15
Visual FoxPro / Re: Problemas al abrir y cerrar tablas
« en: Miércoles 12 de Agosto de 2009, 14:44 »
Mi correo es xodrf@hotmail.com

16
Visual FoxPro / Re: Numero con formato caracter
« en: Miércoles 12 de Agosto de 2009, 02:16 »
_nchar="0000123"
_nsgte=STRTRAN( STR( VAL(_nchar)+1,  7, 0 ), " ", "0" ) :beer:

17
Visual FoxPro / Re: ACTUALIZAR UNA TABLA COMPARTIDA EN RED
« en: Martes 11 de Agosto de 2009, 22:08 »
Ten en cuenta lo siguiente que debes obtener el nro de factura o talonario unicamente y/o exactamente despues de que haya sido presionada el boton grabar el comprobante y no al cargar tu formulario, yo te cuento que en mi formulario de facturacion yo pido al usuario confirmacion del nro generado automaticamente y funciona en red. Te describo como lo hice:
1) buscan el cliente
2) luego van buscando los productos, cantidad, precio etc.
3) Pulsan el boton grabar o cancelan con ESCAPE
*SI CANCELARON NO REGISTRA NADA SALGO!.
*SI GRABARON tomo el archivo de cabacera bloqueo la escritura FLOCK() y envio al final y obtengo el ultimo nro de factura sumado +1 (o sea el siguiente posible nro) muestro al usuario y este cambia y/o acepta si cambia el nro busco en la tabla para ver si no esta duplicado si esta le pido otra vez al usuario que lo cambie, mientras esto sucede los otros usuarios que quieran grabar una factura deben esperar, una vez ingresado un nro valido este se graba y recien alli desbloqueo el fichero de cabecera liberando a los demas usuarios la grabacion, y despues se hacen las demas tareas de registro y descarga de stock etc.
No se si es lo correcto pero me funciona a mi!!!

Obs: el siguiente nro de factura debe es incierto hasta que se busque y se intente grabar, de lo contrario estaria saltando y/o duplicando nros de facturas, segun mi experiencia.

18
Visual FoxPro / Re: Problemas al abrir y cerrar tablas
« en: Martes 11 de Agosto de 2009, 17:23 »
Bueno aca te envio un practico pero simple ejemplo de como manejar los formularios, no se si es la mejor manera pero es la que se!.
Obviamente tu problema de error de apertura y cierre de tablas no te lo va a solucionar.
Pero te ofresco revisar tus formularios solo si deseas publicarlos.

Obs: si esta ayuda te sirvio estas obligado moralmente a ayudar a otras personas con menos conocimientos que tu!!.

19
Visual FoxPro / Re: Correlativo automatico
« en: Lunes 10 de Agosto de 2009, 16:19 »
Lo que quieres no es facil ni imposible.
Yo te recomiendo que lo ordenes tu tabla de cheques por CODIGOBANCO+NROCHEQUE en el caso que sea todo string (o con STR() en para tipo numerico numerico) obteniendo lo sgte.
Bco+NroCheque
010000123   -> banco uno cheque 123
010000124   -> banco uno cheque 124
010000125   -> ...
020000250   -> banco dos cheque 250
020000251   -> ...
...
NN999999

entonces si quieres aberiguar el siguiente nro de cheque del banco 01 haces lo siguiente
SET NEAR ON
SEEK( [020000000] )  &&buscas el siguiente banco (seria el banco 02)+"0000000", se posiciona inmediatamente en el primer
                                &&cheque del banco 02 o banco 03 o el que sea que sigue o posiblemente el final.
SET NEAR OFF
SKIP -1
_sgtenro=VAL(SUBSTR(CODIGO,3,7))+1    &&te calcula el nro del siguiente cheque como valor numerico

*Y POR ARTE DE MAGIA FUNCIONA!, ojo creo que se puede tambien con los nombres de bancos pero se complica un monton
*ahora si lo quieres hacer en base a consultas SQL ufff no te puedo ayudar!! :mellow:

20
Visual FoxPro / Re: Problemas al abrir y cerrar tablas
« en: Lunes 10 de Agosto de 2009, 15:50 »
Bueno no entiendo muy bien porque tu profesor te obliga a abrir y cerrar la tabla,  supongo que para ahorrar recursos pero te cuento que si usas SELECT basada en tablas no abiertas para crear tus cursores para los combos dichas tablas quedan abiertas a menos que las cierres luego de esta sentencia con un USE IN MISTABLAS, te recomiendo que deshabilites los formularios de ALTA y EDICION mientras tiene el foco el formulario con la grilla, y deshabilites el formulario que tiene la grilla mientras estas en los otros formularios de ALTA y/o EDICION y antes de salir de estos formularios lo vuelvas a habilitar, esto te evitara que se cambie el foco entre formularios y/o controles que no deben tener el foco y evitando errores para los que tus formularios no esten preparados.
Por otro lado yo creo que consume mas recursos estar abriendo y cerrando tablas sobre todo si es una pantalla que se usa mucho.
Ten en cuenta que cuando Haces ABM's si abres las tablas de modo exclusivo estas limitando a otros usuarios el acceso a dichas tablas en sistemas en redes, pero en contra partida si utilizas en modo compartido no puedes hacer eliminacion fisica de registros marcados con DELETE, estos dos temas debes estudiarlo bien antes de diseñár tus pantallas sobre todo para uso en redes, no asi cuando la aplicacion es monousuario.
Existen muchas alternativas solo debes estudiarlas, podrias llenar tus combos por programación una vez y no utilizar cursores sobre todo si el contenido de los combos son constante.
Yo te cuento que yo todas las tablas que voy a utilizarlas las abro en el evento THISFORM::INIT() y no las cierro hasta estar seguro que no los usare mas, las tablas que dependen de valores ingresados en los controles de mi pantalla si las abro despues pero siempre de una vez y no las suelto hasta no necesitarla mas, y las cierro en THISFORM::RELEASE() y los cursores y/o auxiliares las envio al disco local.
Deberias postear mas informacion para obtener respuestas de mejor calidad.

21
Visual FoxPro / Re: Conceptos de cursores - Error 1152
« en: Miércoles 22 de Julio de 2009, 16:14 »
Bueno no se si utilizas en red, pero lo mas problables es que si, hasta donde yo se al hacer un SELECT si las tablas involucradas no estan abiertas estas se abren del modo predeterminado ver SET EXCLUSIVE, yo te recomiendo que siempre lo abras en modo de solo lecturas antes del SELECT si no realizaras actualizaciones sobre el y lo cierres luego si no lo utilizaras mas,  siempre debes conservar el principio de menos privilegios y revisar bien que tu codigo no lo este abriendo en otras partes o que no lo hayas cerrado donde debias.
Yo en tu lugar lo haria en una matriz publica si la lista de registros no fueran excesivas, o podrias crear el cursor una vez al iniciar tu programa y no estar haciendolo en cada formulario bueno es una idea nomas, siempre debes pensar en no abusar de los recursos de tu sistema para que este te de mejores prestaciones y velocidad.
Te recomiendo que siempre depures detenidamente tu codigo.
No se si te he ayudado, pero en fin!!

22
Visual FoxPro / Re: Rutina para Renumerar
« en: Miércoles 22 de Julio de 2009, 15:58 »
Yo asi lo haria:
1- Carga en una matriz todos los registros de tu tabla secundaria  que coincidan con el identificador que quieras cambiar ej
SELECT RECNO() FROM tablasecundaria WHERE ID==X INTO ARRAY _rec, luego cambia el identificador de tu tabla principal y a continuacion recorre tu matriz con un bucle asi
FOR _gir=1 TO ALEN( _rec )
       GOTO _rec[_gir]
       REPLACE ID WITH _newid
ENDFOR
para cambiar el id de tu tabla secundaria

2- STRTRAN( STR(_mes,2,0)+STR(_nro,4,0), " ", "0" )

PRUEBALO!!

23
Visual FoxPro / Re: Problemas con Rutina
« en: Miércoles 22 de Julio de 2009, 04:06 »
bueno no entiendo muy bien lo que hace tu codigo, pero se que se estanca en un bucle infinito porque al terminar los reemplazos de tu tabla no volves a seleccionar  encabedet y avanzando un registro o no se cuantos registros es decir
....

SELECT CATApier2009
SET FILTER TO
SET ORDER TO codcta

SELECT encabedet
GO top
DO WHILE .not. EOF()

   SELECT CATApier2009
   *SET FILTER TO
   GOTO TOP
   *SET ORDER TO codcta
   IF SEEK( encabedet.cuenta )
   *IF FOUND()
      DO case
         CASE MONTH(encabedet.fecha)=1
            replace catapier2009.car01 WITH catapier2009.car01+encabedet.cargo
            replace catapier2009.ab01 WITH catapier2009.ab01+encabedet.abono
         CASE MONTH(encabedet.fecha)=2
            replace catapier2009.car02 WITH catapier2009.car02+encabedet.cargo
            replace catapier2009.ab02 WITH catapier2009.ab02+encabedet.abono
         CASE MONTH(encabedet.fecha)=3
            replace catapier2009.car03 WITH catapier2009.car03+encabedet.cargo
            replace catapier2009.ab03 WITH catapier2009.ab03+encabedet.abono
         CASE MONTH(encabedet.fecha)=4
            replace catapier2009.car04 WITH catapier2009.car04+encabedet.cargo
            replace catapier2009.ab04 WITH catapier2009.ab04+encabedet.abono
         CASE MONTH(encabedet.fecha)=5
            replace catapier2009.car05 WITH catapier2009.car05+encabedet.cargo
            replace catapier2009.ab05 WITH catapier2009.ab05+encabedet.abono
         CASE MONTH(encabedet.fecha)=6
            replace catapier2009.car06 WITH catapier2009.car06+encabedet.cargo
            replace catapier2009.ab06 WITH catapier2009.ab06+encabedet.abono
         CASE MONTH(encabedet.fecha)=7
            replace catapier2009.car07 WITH catapier2009.car07+encabedet.cargo
            replace catapier2009.ab07 WITH catapier2009.ab07+encabedet.abono
         CASE MONTH(encabedet.fecha)=8
            replace catapier2009.car08 WITH catapier2009.car081+encabedet.cargo
            replace catapier2009.ab08 WITH catapier2009.ab08+encabedet.abono
         CASE MONTH(encabedet.fecha)=9
            replace catapier2009.car09 WITH catapier2009.car09+encabedet.cargo
            replace catapier2009.ab09 WITH catapier2009.ab09+encabedet.abono
         CASE MONTH(encabedet.fecha)=10
            replace catapier2009.car10 WITH catapier2009.car10+encabedet.cargo
            replace catapier2009.ab10 WITH catapier2009.ab10+encabedet.abono
         CASE MONTH(encabedet.fecha)=11
            replace catapier2009.car11 WITH catapier2009.car11+encabedet.cargo
            replace catapier2009.ab11 WITH catapier2009.ab11+encabedet.abono
         CASE MONTH(encabedet.fecha)=12
            REPLACE CATApier2009.car12 WITH CATApier2009.car12+encabedet.cargo
            REPLACE CATApier2009.ab12 WITH CATApier2009.ab12+encabedet.abono
      endcase
   endif
   
        *///////////////////////////////////////////////////////////////////////
        * si aca no avanzas o retrocedes esta tabla se queda colgado, en un bucle infinito
        * se supone que debe acumular cada uno de los registros de tu tabla encabedet creo
   SELECT encabedet
   SKIP +1
        *///////////////////////////////////////////////////////////////////////
   
ENDdo
DELETE FILE encabedet.dbf
endif


UNLOCK ALL

24
Visual FoxPro / Re: Problema en un formset
« en: Martes 21 de Julio de 2009, 21:31 »
Yo te recomiendo que no trabajes con grupos de formularios (THISFORMSET), pero de todos modos ten en cuenta que al momento de iniciar tus formularios el formulario principal debe estar habilitado y el secundario deshabilitado y oculto y al momento de llamar al segundo formulario debes habilitar tu formulario secundario hacerlo visible y mostrarlo (ENABLED=.T.,VISIBLE=.T.,SHOW()) y deshabilitar tu formulario principal de lo contrario el usuario puede estar cambiando el foco entre el formulario principal y secundario en cualquier momento en el caso que tu codificacion no este preparada para este cambio puede ocurrir errores, y al momento de volver a la pantalla principal debes habilitar tu formulario principal,  y deshabilitar, hacerlo invisible y ocultar tu formulario secundario (ENABLED=.F.,VISIBLE=.F.,HIDE()), dejando los controles perfectamente manejados ya que se hace muy dificil depurar este tipo de interface con multiples fomularios.

En tu formulario secundario debes programar cuidadosamente tus eventos
THISFORMSET.FSECOND.ACTIVATE()
THISFORMSET.FSECOND.DEACTIVATE()
THISFORMSET.FSECOND.HIDE()
y no dejes ningun control habilitado que no se requerido en el momento.

Pd. al momento de recibir el foco el formulario secundario al menos un control debe estar habilitado, esto es para el secundario y el principal de lo contrario sin responder.
 
Buena Suerte y espero que lo soluciones

25
Visual FoxPro / Re: Mantener las Propiedades de un grid
« en: Martes 21 de Julio de 2009, 20:51 »
Hasta donde yo se el evento THISFORM.GRID1.INIT() se ejecuta antes que THISFORM.INIT() y alli radica tu problema intenta lo
siguiente: crea un duplicado de tu formulario,  deshabilita tu GRID (THISFORM.GRID1.ENABLED=.F.) desde el IDE, y carga estas sentencias en el evento THISFORM.GRID1.INIT()
WITH THIS
       .RECORDSOURCE=""
       .COLUMN1.CONTROLSOURCE=""
       ...
       .COLUMNN.CONTROLSOURCE=""
ENDWITH
y no te olvides de deshabilitar el redimensionamiento de las columnas THISFORM.GRID1.COLUMNX.RESIZABLE=.F. desde el IDE

Esto sucede porque la grilla al iniciarse trata de asignarse la primer tabla abierta, pero con esas sentencias se impide esto

Obs. IDE es el editor del fomulario
Buena Suerte!!!
PD: chequea tu sentencia THISFORM.GRID1.RECORDSOURCETYPE=6 no es valido en VFP6 ni VFP9 no se en los demas

Páginas: [1] 2