Error o problema al grabar
Error o problema al grabar
Entorno de trabajo Linux Suse 11 SP 1, con FiveLinux y Harbour.
Esta aconteciendo lo siguiente:
1. Se estaba probando el sistema con un solo equipo y todo funciona ok
2. El sistema funciona en entorno de red con archivos compartidos
3. Al grabar un nuevo registro en 2 equipos distintos, al mismo tiempo, se graba un registro con basura y otro bien
4. Hay veces en que solo queda un registro con los valores de una de las cajas.
5. Al hacer la apertura en ambas cajas deben quedar 2 registros.
6. El archivo se abre en modo compartido
Adjunto trozo de código como se graba.
msgbox('Paso grabar')
Sele poszvta; sumreg() // Atualiza registro Z
Repla zvtnumz With nzx, zvtfech With fechax,;
zvtfape With Dtos(Date())+Left(Strtran(timex,':',''),4),;
zvtncaja With ncajax, zvtboli With boleta_inicialx,;
zvtbolf With boleta_finalx
Dbcommit(); Dbunlock()
Func sumreg
Dbappend()
If Neterr()
pmsgx=Savescreen(13,10,20,67); msgbox(MSGp01_028,,,32,0)
While Neterr(); linkey(.3); Dbappend()
enddo
Restscreen(13,10,20,67,pmsgx)
Endif
Return .t.
Esta aconteciendo lo siguiente:
1. Se estaba probando el sistema con un solo equipo y todo funciona ok
2. El sistema funciona en entorno de red con archivos compartidos
3. Al grabar un nuevo registro en 2 equipos distintos, al mismo tiempo, se graba un registro con basura y otro bien
4. Hay veces en que solo queda un registro con los valores de una de las cajas.
5. Al hacer la apertura en ambas cajas deben quedar 2 registros.
6. El archivo se abre en modo compartido
Adjunto trozo de código como se graba.
msgbox('Paso grabar')
Sele poszvta; sumreg() // Atualiza registro Z
Repla zvtnumz With nzx, zvtfech With fechax,;
zvtfape With Dtos(Date())+Left(Strtran(timex,':',''),4),;
zvtncaja With ncajax, zvtboli With boleta_inicialx,;
zvtbolf With boleta_finalx
Dbcommit(); Dbunlock()
Func sumreg
Dbappend()
If Neterr()
pmsgx=Savescreen(13,10,20,67); msgbox(MSGp01_028,,,32,0)
While Neterr(); linkey(.3); Dbappend()
enddo
Restscreen(13,10,20,67,pmsgx)
Endif
Return .t.
- karinha
- Posts: 7933
- Joined: Tue Dec 20, 2005 7:36 pm
- Location: São Paulo - Brasil
- Been thanked: 3 times
- Contact:
Re: Error o problema al grabar
Aele poszvta; sumreg() // Atualiza registro Z
RLOCK() // Traba el registro.
Repla zvtnumz With nzx, zvtfech With fechax,;
zvtfape With Dtos(Date())+Left(Strtran(timex,':',''),4),;
zvtncaja With ncajax, zvtboli With boleta_inicialx,;
zvtbolf With boleta_finalx
Dbcommit(); Dbunlock()
RLOCK() // Traba el registro.
Repla zvtnumz With nzx, zvtfech With fechax,;
zvtfape With Dtos(Date())+Left(Strtran(timex,':',''),4),;
zvtncaja With ncajax, zvtboli With boleta_inicialx,;
zvtbolf With boleta_finalx
Dbcommit(); Dbunlock()
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Re: Error o problema al grabar
Coloque el siguiente codigo, y el resultado es: me agrega 2 registrs pero uno lo dehja con basura y el otro con los datos.
La verdad este error me dejo muy descontento y no lo he podido solucionar, es grave.
function Main()
local ncajax:=10
use /media/paso/paso shared
msgalert('Grabar registro')
Sele paso
do while .not. Dbappend();inkey(1);enddo
do while .not. rlock();inkey(1);enddo
Repla zvtnumz With 10+ncajax, zvtfech With date()+ncajax,;
zvtfape With Dtos(Date())+Left(Strtran(time(),':',''),4),;
zvtncaja With ncajax, zvtboli With 100+ncajax,;
zvtbolf With 200+ncajax
Dbcommit()
Dbunlock()
msgalert('Paso grabar')
Use
Return .T.
La verdad este error me dejo muy descontento y no lo he podido solucionar, es grave.
function Main()
local ncajax:=10
use /media/paso/paso shared
msgalert('Grabar registro')
Sele paso
do while .not. Dbappend();inkey(1);enddo
do while .not. rlock();inkey(1);enddo
Repla zvtnumz With 10+ncajax, zvtfech With date()+ncajax,;
zvtfape With Dtos(Date())+Left(Strtran(time(),':',''),4),;
zvtncaja With ncajax, zvtboli With 100+ncajax,;
zvtbolf With 200+ncajax
Dbcommit()
Dbunlock()
msgalert('Paso grabar')
Use
Return .T.
karinha wrote:Aele poszvta; sumreg() // Atualiza registro Z
RLOCK() // Traba el registro.
Repla zvtnumz With nzx, zvtfech With fechax,;
zvtfape With Dtos(Date())+Left(Strtran(timex,':',''),4),;
zvtncaja With ncajax, zvtboli With boleta_inicialx,;
zvtbolf With boleta_finalx
Dbcommit(); Dbunlock()
- karinha
- Posts: 7933
- Joined: Tue Dec 20, 2005 7:36 pm
- Location: São Paulo - Brasil
- Been thanked: 3 times
- Contact:
Re: Error o problema al grabar
Code: Select all | Expand
FUNCTION TRAVEREG(TEMPO)
DO WHILE .NOT. REGLOCK(TEMPO)
SYSREFRESH()
MSGWAIT("AGUARDE ACESSO ARQUIVO","Bloqueando o registro...Aguarde",01)
ENDDO
RETURN(0)
FUNCTION ADICIONE(TEMPO)
DO WHILE .NOT. ADIREG(TEMPO)
SYSREFRESH()
MSGWAIT("AGUARDE ACESSO ARQUIVO","Adição de novo registro...Aguarde",01)
ENDDO
RETURN(0)
FUNCTION ADIREG(TEMPO)
* RETORNA VERDADEIRA SE O REGISTRO FOI APENDADO.O NOVO REG.PASSA A SER O REG.ATUAL BLOQUEADO
* PAR: 1-NUMERICO-TEMPO DE ESPERA
LOCAL SEMPRE, TELA
APPEND BLANK
IF .NOT. NETERR()
TRAVEREG(0)
RETURN(.T.)
ENDIF
SEMPRE=(TEMPO=0)
DO WHILE( SEMPRE .OR. TEMPO > 0 ) .AND. INKEY() <> 27
SYSREFRESH()
APPEND BLANK
IF .NOT. NETERR()
TRAVEREG(0)
RETURN(.T.)
ENDIF
SYSWAIT(.5)
TEMPO=TEMPO-.5
ENDDO
RETURN( .F. ) && NAO BLOQUEADO
FUNCTION REGLOCK(TEMPO)
* TENTA TRAVAR O REGISTRO ATUAL
*PAR: 1-NUMERICO-TEMPO ESPERA
LOCAL SEMPRE, TELA
IF RLOCK()
RETURN(.T.) && BLOQUEADO
ENDIF
SEMPRE=(TEMPO=0)
DO WHILE (SEMPRE .OR. TEMPO > 0 ) .AND. INKEY() <> 27
SYSREFRESH()
IF RLOCK()
RETURN(.T.) && BLOQUEADO
ENDIF
SYSWAIT( .5 )
TEMPO=TEMPO-.5
ENDDO
RETURN( .F. ) && NAO BLOQUEADO
FUNCTION DESTRAVA()
COMMIT
UNLOCK
RETURN(NIL)
Ejemplos:
TRAVEREG(0)
DbEstoque:Delete()
DESTRAVA(0)
WHILE !EOF()
SYSREFRESH()
IF EOF()
EXIT
ENDIF
TRAVEREG(0) // ALTERACION
REPLACE VALOR WITH TOTNF
REPLACE PAGO WITH XDATBAIXA
REPLACE VENDEDOR WITH LEFT(XCODVEND,2)
REPLACE CAIXA WITH XCAIXA
DESTRAVA(0)
XVAL := XVAL+TOTNF
DBSKIP()
ENDDO
//-> Se Existir Diferen‡a no Valor -> Criar um Novo Registro
IF nValorPago < nValorTitulos
// Calcula a Diferen‡a do Valor Pago Menos o Valor dos T¡tulos.
nValorDiferenca := Round( nValorTitulos, 2 ) - Round( nValorPago, 2 )
SELECT ( DbApagarReceb:cAlias )
DbApagarReceb:SetOrder( 2 ) // Ordenado Por CGC Para Filtro
XDM := "DM"
SEEK STRZERO(XNNF,10)+XDM
IF NNF = XNNF .AND. COMP = XDM
XDM:="D2"
ENDIF
ADICIONE(0) // UN NUEVO REGISTRO
REPLACE NNF WITH XNNF
REPLACE COMP WITH XDM
REPLACE TOTNF WITH nValorDiferenca
REPLACE EMIS WITH XDA
REPLACE VENCI WITH XDA
REPLACE CGCCLI WITH nFILCGC1
REPLACE VENDEDOR WITH LEFT(XCODVEND,2)
REPLACE CAIXA WITH XCAIXA
DESTRAVA(0)
ENDIF
Saludos
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Re: Error o problema al grabar
Estoy trabajando con Linux no con Windows, quizas en windows funcione, pero en Linux hasta la fecha no ha funcionado, y he quedado PLOP
- Antonio Linares
- Site Admin
- Posts: 42513
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 73 times
- Contact:
Re: Error o problema al grabar
Jorge,
No has comentado que esas usando samba para acceder al servidor en Windows...
Posiblemente ahi esté el problema
No has comentado que esas usando samba para acceder al servidor en Windows...
Posiblemente ahi esté el problema
Re: Error o problema al grabar
Los archivo fisicamente estan en un servidor centos con samba o en un servidor NT, y pruebo desde uno u otro lado igual me da el error.
Antonio Linares wrote:Jorge,
No has comentado que esas usando samba para acceder al servidor en Windows...
Posiblemente ahi esté el problema
-
- Posts: 989
- Joined: Thu Nov 24, 2005 3:01 pm
- Location: Madrid, España
Re: Error o problema al grabar
Jorge,
según lo que entendí al leer tu mensaje, estás trabajando con Linux pero los archivos están en Samba o NT. ¿Como has montado los volúmenes donde estan los archivos? El tema de bloqueos de archivos es todo un mundo, hay que asegurarse que lo que usas para montar los volúmenes compartidos trasladan los bloqueos al servidor real.
Para verificarlo puedes hacer algo sencillo: Desde dos estaciones intenta bloquear el mismo registro, una de las dos debe fallar, si no falla es que hay que hilar más fino para asegurarse que está todo correctamente configurado.
http://www.samba.org/samba/docs/man/Sam ... cking.html
según lo que entendí al leer tu mensaje, estás trabajando con Linux pero los archivos están en Samba o NT. ¿Como has montado los volúmenes donde estan los archivos? El tema de bloqueos de archivos es todo un mundo, hay que asegurarse que lo que usas para montar los volúmenes compartidos trasladan los bloqueos al servidor real.
Para verificarlo puedes hacer algo sencillo: Desde dos estaciones intenta bloquear el mismo registro, una de las dos debe fallar, si no falla es que hay que hilar más fino para asegurarse que está todo correctamente configurado.
http://www.samba.org/samba/docs/man/Sam ... cking.html
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Re: Error o problema al grabar
En los clientes los monto
mount -l //150.100.11.110/fasa /media/paso -o username=user,password=pass, rw
Realice lo indicado y el registro lo bloquea bien, el problema es al agrega un registro simultaneamente.
Agrega los 2 registros, pero uno queda con basura y el otro bien.
Si tienes una idea, se agradecería.
mount -l //150.100.11.110/fasa /media/paso -o username=user,password=pass, rw
Realice lo indicado y el registro lo bloquea bien, el problema es al agrega un registro simultaneamente.
Agrega los 2 registros, pero uno queda con basura y el otro bien.
Si tienes una idea, se agradecería.
Carlos Mora wrote:Jorge,
según lo que entendí al leer tu mensaje, estás trabajando con Linux pero los archivos están en Samba o NT. ¿Como has montado los volúmenes donde estan los archivos? El tema de bloqueos de archivos es todo un mundo, hay que asegurarse que lo que usas para montar los volúmenes compartidos trasladan los bloqueos al servidor real.
Para verificarlo puedes hacer algo sencillo: Desde dos estaciones intenta bloquear el mismo registro, una de las dos debe fallar, si no falla es que hay que hilar más fino para asegurarse que está todo correctamente configurado.
http://www.samba.org/samba/docs/man/Sam ... cking.html
- Antonio Linares
- Site Admin
- Posts: 42513
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 73 times
- Contact:
Re: Error o problema al grabar
Jorge,
Haz un bucle en un solo ordenador para que añada 10 registros sucesivos y comprueba como quedan
Haz un bucle en un solo ordenador para que añada 10 registros sucesivos y comprueba como quedan
-
- Posts: 989
- Joined: Thu Nov 24, 2005 3:01 pm
- Location: Madrid, España
Re: Error o problema al grabar
jgayoso wrote:En los clientes los monto
mount -l //150.100.11.110/fasa /media/paso -o username=user,password=pass, rw
mount -l lista lo montado, debería ser -t <fstype>. ¿Que fstype estás indicando?
jgayoso wrote:Realice lo indicado y el registro lo bloquea bien, el problema es al agrega un registro simultaneamente.
El registro lo bloquea bien, es decir que uno falla, ¿Es así?
Prueba el siguiente código desde dos estaciones diferentes:
// busca una dfb cualquiera con mas de 1 regrto, la llamaremos 'prueba'
USE prueba
dBGoto( 1)
? Rlock()
Inkey(0)
Close Prueba
Esto hará que se bloquee el registro 1 y se quede esperando una tecla, En la primera estación debería imprimir .T., y en las siguientes .F.. Si en las siguientes tambien imprime .T. es que los bloqueos no estan funcionando. Por favor confirmame esto.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Re: Error o problema al grabar
Carlos, bloquear el registro funciona bien, el problema es al insertar simultanemente, uno queda bien y el otro mal.
¿Podrias indicarme si a ti te funciona todo OK, como montas los directorios y el fstype que utilizas? ¿cual es tu configuración utilizada? usas samba, nfs, etc.
Desde ya se agradece vuestra ayuda.
Jorge Gayoso
¿Podrias indicarme si a ti te funciona todo OK, como montas los directorios y el fstype que utilizas? ¿cual es tu configuración utilizada? usas samba, nfs, etc.
Desde ya se agradece vuestra ayuda.
Jorge Gayoso
Carlos Mora wrote:jgayoso wrote:En los clientes los monto
mount -l //150.100.11.110/fasa /media/paso -o username=user,password=pass, rw
mount -l lista lo montado, debería ser -t <fstype>. ¿Que fstype estás indicando?jgayoso wrote:Realice lo indicado y el registro lo bloquea bien, el problema es al agrega un registro simultaneamente.
El registro lo bloquea bien, es decir que uno falla, ¿Es así?
Prueba el siguiente código desde dos estaciones diferentes:
// busca una dfb cualquiera con mas de 1 regrto, la llamaremos 'prueba'
USE prueba
dBGoto( 1)
? Rlock()
Inkey(0)
Close Prueba
Esto hará que se bloquee el registro 1 y se quede esperando una tecla, En la primera estación debería imprimir .T., y en las siguientes .F.. Si en las siguientes tambien imprime .T. es que los bloqueos no estan funcionando. Por favor confirmame esto.
-
- Posts: 989
- Joined: Thu Nov 24, 2005 3:01 pm
- Location: Madrid, España
Re: Error o problema al grabar
jgayoso wrote:Carlos, bloquear el registro funciona bien, el problema es al insertar simultanemente, uno queda bien y el otro mal.
Por favor realiza las pruebas que te sugerí. Que RLock() te retorne .T. no significa que esté funcionando correctamente. En el post te puse una test para verificarlo, si no haces la prueba no tendremos la garantía de que al menos eso funciona.
La poca información que pones no ayuda a descubrir ni siquiera la configuración exacta, son lo cual es dificil arriesgar un problema.
Actualmente uso estaciones Linux que se conectan a un share de Windows 2003 sin problemas, alguna vez usé un share de samba de la misma forma, mezclado con una aplicacion Clipper DBFCDX y tambien funcionaba perfectamente, pero a este entorno ya no tengo acceso porque es un cliente de hace unos 10 años que ya no tengo.
Lo raro es que el registro contenga basura.
Desactiva en todos lados la opcion OP_LOCKS, para garantizar que todo sea compartido sin optimizaciones extrañas.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
- Antonio Linares
- Site Admin
- Posts: 42513
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 73 times
- Contact:
Re: Error o problema al grabar
Carlos,
Sabes si es posible compartir una carpeta de un ordenador Linux a otro sin que se tenga que usar Windows ?
Lo ideal seria poder eliminar samba de las pruebas...
Sabes si es posible compartir una carpeta de un ordenador Linux a otro sin que se tenga que usar Windows ?
Lo ideal seria poder eliminar samba de las pruebas...
-
- Posts: 989
- Joined: Thu Nov 24, 2005 3:01 pm
- Location: Madrid, España
Re: Error o problema al grabar
Antonio,
NFS es la forma más sencilla, más compatible entre 'unices'. Linux > 2.6 maneja bloqueos correctamente via flock() o fcntl(), que son las funciones clásicas de bloqueos de rangos de bytes.
Si usamos NFS hay que verificar si wine transfiere correctamente los bloqueos a NFS.
Si va a haber bloqueos originados en una aplicacion win32, lo mejor sería tener el share montado con samba, y asegurarse que todas las estaciones, linux y win, acceden vía samba, y dejar a samba gestionar los bloqueos. Por ejemplo en Linux:
//miserver/mishare /mnt/mishare cifs exec,credentials=/etc/cifspw 0 0
Si otro proceso accede a los mismo ficheros de samba pasar por él, es posible que no se vean los bloqueos entre los diferentes procesos, por lo que siempre seria deseable usar samba. Por ejemplo, un programa que conecta via Wine + NFS generaria bloqueos que no vería un programa Win32+samba.
NFS es la forma más sencilla, más compatible entre 'unices'. Linux > 2.6 maneja bloqueos correctamente via flock() o fcntl(), que son las funciones clásicas de bloqueos de rangos de bytes.
Si usamos NFS hay que verificar si wine transfiere correctamente los bloqueos a NFS.
Si va a haber bloqueos originados en una aplicacion win32, lo mejor sería tener el share montado con samba, y asegurarse que todas las estaciones, linux y win, acceden vía samba, y dejar a samba gestionar los bloqueos. Por ejemplo en Linux:
//miserver/mishare /mnt/mishare cifs exec,credentials=/etc/cifspw 0 0
Si otro proceso accede a los mismo ficheros de samba pasar por él, es posible que no se vean los bloqueos entre los diferentes procesos, por lo que siempre seria deseable usar samba. Por ejemplo, un programa que conecta via Wine + NFS generaria bloqueos que no vería un programa Win32+samba.