Error o problema al grabar

Error o problema al grabar

Postby jgayoso » Thu Oct 04, 2012 5:57 pm

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.
jgayoso
 
Posts: 170
Joined: Sat Aug 07, 2010 11:36 pm
Location: Chile

Re: Error o problema al grabar

Postby karinha » Thu Oct 04, 2012 7:53 pm

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()
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Error o problema al grabar

Postby jgayoso » Fri Oct 05, 2012 11:41 am

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.



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()
jgayoso
 
Posts: 170
Joined: Sat Aug 07, 2010 11:36 pm
Location: Chile

Re: Error o problema al grabar

Postby karinha » Fri Oct 05, 2012 12:36 pm

Code: Select all  Expand view  RUN

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
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Error o problema al grabar

Postby jgayoso » Mon Oct 22, 2012 5:48 pm

Estoy trabajando con Linux no con Windows, quizas en windows funcione, pero en Linux hasta la fecha no ha funcionado, y he quedado PLOP
jgayoso
 
Posts: 170
Joined: Sat Aug 07, 2010 11:36 pm
Location: Chile

Re: Error o problema al grabar

Postby Antonio Linares » Tue Oct 23, 2012 2:09 am

Jorge,

No has comentado que esas usando samba para acceder al servidor en Windows...

Posiblemente ahi esté el problema
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42118
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Error o problema al grabar

Postby jgayoso » Wed Oct 24, 2012 1:23 pm

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
jgayoso
 
Posts: 170
Joined: Sat Aug 07, 2010 11:36 pm
Location: Chile

Re: Error o problema al grabar

Postby Carlos Mora » Wed Oct 24, 2012 2:56 pm

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
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
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Error o problema al grabar

Postby jgayoso » Wed Oct 24, 2012 7:11 pm

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.




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
jgayoso
 
Posts: 170
Joined: Sat Aug 07, 2010 11:36 pm
Location: Chile

Re: Error o problema al grabar

Postby Antonio Linares » Wed Oct 24, 2012 8:45 pm

Jorge,

Haz un bucle en un solo ordenador para que añada 10 registros sucesivos y comprueba como quedan
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42118
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Error o problema al grabar

Postby Carlos Mora » Thu Oct 25, 2012 8:39 am

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
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Error o problema al grabar

Postby jgayoso » Wed Oct 31, 2012 9:21 pm

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


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.
jgayoso
 
Posts: 170
Joined: Sat Aug 07, 2010 11:36 pm
Location: Chile

Re: Error o problema al grabar

Postby Carlos Mora » Fri Nov 02, 2012 11:08 am

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
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Error o problema al grabar

Postby Antonio Linares » Fri Nov 02, 2012 1:42 pm

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...
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42118
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Error o problema al grabar

Postby Carlos Mora » Mon Nov 05, 2012 3:29 pm

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.
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 47 guests