Clipper On Line • Ver Tópico - DbAppend falha

DbAppend falha

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

DbAppend falha

Mensagempor leandrolinauer » 09 Abr 2015 17:27

Boa tarde a todos.
Pesquisei no fórum e não encontrei algo sobre a falha que ocorre aqui em um único lugar e a única loja.

Ocorre o seguinte:
Dois vendedores emitindo lançamentos de orçamento no banco de dados de orçamento, compartilhado.
Os dois vendedores efetuam registro de um item cada um enviando o comando DbAppend() ao banco de dados ao mesmo tempo, logicamente e tecnicamente deveria abrir no banco de dados dois registros em branco um para cada um, correto.
Bom, isto não ocorre rotineiramente, mas ocorre e necessito descobrir exatamente o porque.
Código abaixo
Static Procedure GravaOrc(atipo,amodo)
ShowWaitProc()
If amodo=="INCLUIR" //OCORRE EXATAMENTE NESTA LINHA ABAIXO
   DbAppend() //tenta abrir o registro
   While NetErr() //se nao conseguir abrir o registro, tente novamente
      ShowWaitProc()
      DbAppend() //se houve erro, retente para inserir novo registro
   End
  **** comentário sobre a linha acima no final do código.
   Field->NR_DOC    :=WDoc 
   Field->DATA      :=WData
   Field->CODIGO    :=WCod 
   Field->NOME      :=WNome
   Field->VEND      :=WVend
   Field->PRACA     :=WPraca
   Field->COD_MERC  :=WMerc
   Field->TIPO      :=p_DV
   Field->GENERICO  :=If(Left(wMerc,4)=="9999",w_DESCRICAO,w_GENERICO)
ElseIf atipo=="DBCOMITA" //E ALTERAR
   While !RLock()
     ShowMessage(,,"Aguardando liberação do registro do orçamento...",1)
   End
EndIf   

Field->DESCRICAO :=w_DESCRICAO
Field->GENERICO  :=w_GENERICO
Field->DECIMAIS  :=w_DECIMAIS
Field->ITEM      :=w_ITEM
Field->UNIDADE   :=w_UNIDADE
Field->LUCRO     :=w_LUCRO
Field->CUSTO     :=w_CUSTO
Field->COMISSAO  :=w_COMISSAO
Field->GER_COM   :=w_GER_COM
Field->SITUACAO  :=w_SITUACAO
Field->DESCONTO  :=w_DESCONTO
Field->VR_VENDIDO:=w_VR_VENDIDO
Field->SETOR1    :=w_SETOR1
Field->SETOR2    :=w_SETOR2
Field->SETOR3    :=w_SETOR3
Field->SETOR4    :=w_SETOR4
Field->QTE_REAL  :=w_QTE_REAL
Field->QTE_ENT   :=w_QTE_ENT
Field->QTE_REQ   :=w_QTE_REQ
Field->OPER      :=WOper
ShowWaitProc()
If(aTipo=="DBCOMITA",DbCommit(),.T.)
ShowWaitProc()
If(aTipo=="DBCOMITA".And.amodo=="ALTERAR",DbUnLock(),.T.)
ShowWaitProc()
Return .T.


Antes eu não usava a função neterr(), e ocorria com mais frequencia a falha, passei usar o neterr() e diminuiu a falha de sumir com algum item.
no entanto o erro em particular que ocorreu agora foi coisa esquisita.
um vendedor lançou o item 0917004 com descricao latex tal tal tal no valor 88,80 total e 2 quantidades
o outro vendedor lançou o item 0412026 com a descricao revestimento tal tal tal no valor total de 400,00 e 26 metros.
detalhe crucial, neste registro aberto no banco de dados apenas ficou 0917004 com a descricao revestimento tal tal tal no valor 88,80 com 26 metros.
um absurdo de erro, ao invés de haver dois registros, apenas abriu um e misturou os dois.

pergunto?, na internet pesquisando descobrir que usar o dbappend() desta forma, causa a liberação dos bloqueios pendentes, quais?, nao entendi, e usando
Dbappend(.F.) passando o parametro .F., os bloqueios são mantidos, quais não entendi.
fiz teste em laboratório não vi diferença alguma na gravação, grava normal, agora não sei se em produção em estado crítico daria algum problema ou não.
por isto pergunto agora primeiro antes de me aventurar.

Ou se por acaso há alguma outra forma de abrir o registro com mais segurança ou apenas um abrir e os outros ficam aguardando na fila, até que este seja gravado, coisa de 1 segundo para cada item, se tem como fazer isto, um só abrir o registro e os outros aguardarem ficaria melhor e mais seguro.

aguardo retorno.
Um abraço a todos.
:D
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 373
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

DbAppend falha

Mensagempor Itamar M. Lins Jr. » 09 Abr 2015 20:03

Ola!
Seu código está com falha.
Eu uso esta função em baixo. Nunca me deixou na mão.

************************
Function incluir(cAlias)
************************
*
*
hb_default(@cAlias,Alias())   

Do While .T.
  (cAlias)->(DbAppend())
   If neterr()
      hwg_Msginfo('Tentando Incluir no Arquivo, '+cAlias)
   Else
      exit
   EndIf
EndDo

RETURN .T.

Exemplo de uso:


If lIncluir
   Incluir("clientes")
else
   TravaRegistro("clientes")
endif

clientes->xyz := "XXX" //aqui o replace!
...
NetFlush("clientes")




**************************
Function TravaRegistro(db)
**************************
*
*
Local lRet := .T.
hb_default(@db,Alias())

Do While .T.

   If (db)->(rlock())
      exit
   Else
      If hwg_MsgYesNo('Tentando Bloquear o Registro, '+db+' Tentar Novamente ?')
      Else
         lRet := .F.
         Exit
      EndIf
   EndIf

EndDo
Return lRet

*********************
Function NetFlush(db)
*********************
*
*
hb_default(@db,Alias())   
If lRddLeto
   (db)->(Leto_Commit())
endif
(db)->(DbCommit())
(db)->(DbUnlock())

Return .T.



A falha é o Dbappend() sem neterr() logo abaixo, linha 07 "DbAppend() //se houve erro, retente para inserir novo registro)"
Coloque alias em tudo!

Do while .t. //add isso aqui!
   DbAppend() //tenta abrir o registro
   If NetErr() //se nao conseguir abrir o registro, tente novamente
      ShowWaitProc()
       //Não precisa -> DbAppend() //se houve erro, retente para inserir novo registro
   else
      exit
   endif
Enddo


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

DbAppend falha

Mensagempor leandrolinauer » 10 Abr 2015 10:25

Bom dia Itamar, obrigado pela ajuda.
Substitui o inicio da função por
   While .T.
      ShowWaitProc()
      DbAppend()
      If !NetErr()
   Exit   
      EndIf
   End
   ..replaces...
   Commit


Fiquei com uma pulga atrás da orelha em questão de ordem de gravação, para ver se estou certo nos procedimentos ou não.
Para gravar quando efetuo um APPEND()
While .T.
   (ALIAS)->(DbAppend())
   If !NetErr()
Exit   
   EndIf
End

(ALIAS)->XYZ:=o_XYZ  //efetuo os replaces
(ALIAS)->(DbCommit()) // gravo no banco de dados
(ALIAS)->(DBUnlock()) //LIBERO O REGISTRO


Usa-se nesta sequencia acima?
O DbUnLock() esta correto ou é melhor o uso do DbRUnlock()?

Para gravar uma alteração em um registro
While (ALIAS)->(!RLock())
   ///ficha em uso
End
(ALIAS)->XYZ:=o_XYZ //REPLACE
(ALIAS)->(DbCommit()) // gravo no banco de dados
(ALIAS)->(DBUnlock()) //LIBERO O REGISTRO


Para uma exclusão do registro

While (ALIAS)->(!RLock())
   ///ficha em uso
End
(ALIAS)->(DbDelete()) //deleto o registro
(ALIAS)->(DbCommit()) // gravo no banco de dados (TEM QUE GRAVAR APÓS O DELETE?)
(ALIAS)->(DBUnlock()) //LIBERO O REGISTRO (TEM QUE LIBERAR O REGISTRO APOS O DELETE?)


Aguardo retorno, grato por enquanto.
Um abraço
:)Pos
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 373
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

DbAppend falha

Mensagempor janio » 12 Jun 2017 08:30

Em 13 anos de programação nunca o DbAppend() havia falhado pra mim.

Mas eis que o grande dia chegou hehehehe (um cliente com problema)

Vou usar a função postada e ver se resolve o problema

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

DbAppend falha

Mensagempor leandrolinauer » 12 Jun 2017 11:55

Bom dia Janio.
Eu continuo com mesmo problema, já fiz todas as alterações e continua ocorrendo a falha, simplesmente não registra o item que tem que registrar.
Se você conseguir descobrir o porque, me avisa.
Detalhe:
São 8 lojas e em apenas uma da o problema.
Já refis os conectores;
Já troquei o cabo de rede;
Já refis todo aterramento;
Já troquei as tomadas e colocando em ordem a fase;
Já troquei os fios de energia;

Medi com aparelho o terra e a energia e estão em perfeita execução, só me resta pedir a troca do transformador da rua (hehehe).

Aguardo seu resultado.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 373
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

DbAppend falha

Mensagempor JoséQuintas » 12 Jun 2017 16:08

As máquinas não travam com essas rotinas?
Considerem milhares de tentativas de lock() por segundo....

Simplifiquei tudo com algumas rotinas:

RecAppend()
REPLACE ...
RecUnlock()

RecLock()
REPLACE ...
RecUnlock()

RecDelete()
ou
RecLock(0
DELETE
RecUnlock()

É o mesmo que já foi passado, apenas um intervalo de tempo entre cada tentativa.

/*
ZE_REDE - ROTINAS PARA USO EM REDE
1995.04.24
*/

#include "inkey.ch"

FUNCTION RecLock( lForever )

   LOCAL nCont := 1

   hb_Default( @lForever, .T. )
   wSave( MaxRow() - 1, 0, MaxRow(), MaxCol() )
   DO WHILE .T.
      IF rLock()
         SKIP 0
         EXIT
      ENDIF
      Mensagem( "Aguardando liberação do registro em " + Alias() + "... Tentativa " + lTrim( Str( nCont ) ) + iif( lForever, "", ". ESC cancela" ) )
      IF Inkey( 0.5 ) == K_ESC .AND. ! lForever
         EXIT
      ENDIF
      nCont += 1
   ENDDO
   WRestore()

   RETURN ( rLock() )

FUNCTION RecAppend( lForever )

   LOCAL nCont := 1, lOk := .F.

   hb_Default( @lForever, .T. )
   wSave( MaxRow()-1, 0, MaxRow(), MaxCol() )
   DO WHILE .T.
      APPEND BLANK
      IF ! NetErr()
         lOk := .T.
         RecLock()
         SKIP 0
         EXIT
      ENDIF
      Mensagem( "Aguardando liberação do arquivo: " + Alias() + "... Tentativa " + LTrim( Str( nCont ) ) + iif( lForever, "", ". ESC cancela" ) )
      IF Inkey( 0.5 ) == K_ESC .AND. ! lForever
         EXIT
      ENDIF
      nCont += 1
   ENDDO
   WRestore()

   RETURN lOk

FUNCTION RecDelete( lForever )

   LOCAL lOk := .F.

   hb_Default( @lForever, .T. )
   IF RecLock( lForever )
      DELETE
      RecUnlock()
      lOk := .T.
   ENDIF

   RETURN lOk

FUNCTION RecUnlock()

   SKIP 0
   UNLOCK

   RETURN NIL
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DbAppend falha

Mensagempor Jairo Maia » 12 Jun 2017 17:49

Olá Pessoal,

Só uma questão sobre APPEND BLANK ou DbAppend() (extraído do xHarbour Language Reference Guide):

APPEND BLANK:
Shared file access: When the database is opened in SHARED mode, the APPEND BLANK command attempts to lock the ghost record before appending a new record to the file (the ghost record is the one located at LastRec()+1). If this record lock fails, function NetErr() is set to .T. (true) and no record is appended. When the record lock succeeds, it remains active until a new APPEND BLANK command is issued or the lock is explicitely released with the UNLOCK command. A file lock obtained with the FLock() function is not released by the APPEND BLANK command.

Note: APPEND BLANK works only in the current work area. Its functional equivalent is the DbAppend() function which can create a new record in other work areas when used in an aliased expression.


DbAppend():
The DbAppend() function is guaranteed to add a new record when the database file is open for EXCLUSIVE access by the application. This, however, is rarely the case. In a multi-user environment, databases are usually open for SHARED access. As a result, DbAppend() tries to lock the new record so that no other user can change it during the operation. If this lock fails, there is no new record available for the application. Instead, the function NetErr() is set to .T. (true) indicating a failure of locking the new record. A failure of this kind can happen, for example, when another application has obtained a file lock prior to DbAppend(). Such an error condition is gracefully handled if NetErr() is checked after DbAppend().

If DbAppend() has successfully locked the new record, all other records locks set in the database are released by default. To keep pending record locks in place, the value .F. (false) must be passed to DbAppend().
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

DbAppend falha

Mensagempor janio » 12 Jun 2017 18:08

São 8 lojas e em apenas uma da o problema.
Já refis os conectores;
Já troquei o cabo de rede;
Já refis todo aterramento;
Já troquei as tomadas e colocando em ordem a fase;
Já troquei os fios de energia;


Ja trocou o SERVIDOR? kkkkk (pode ser problema de disco)

No meu caso, muuuuuito esporadicamente estou recebendo o erro:
Funcao.......: DBAPPEND
Linha........: 0
Prg..........:
Description..: Server Error (REPLACE: Trying to modify record with no lock)
Operation....: ChkRspErr


Fiz a mudança na rotina e atualizei no cliente. Temos que aguardar alguns dias pra ver se o bendito erro volta

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

DbAppend falha

Mensagempor JoséQuintas » 12 Jun 2017 19:26

Isso lembra um erro da rede NOVELL.
Após uma semana de uso, SEM DESLIGAR, o servidor acusava um registro fantasma e o append falhava.
Algo como o arquivo ter 100 registros, e o append tentar adicionar o 102, ao invés do 101.
Nesse caso, ou reiniciando o servidor, ou em eventual reindexação COM COPY pra trocar o arquivo de lugar.
Assim a Novell "esquecia" seu controle anterior de arquivo.

Parece que acontecia o mesmo com o driver da Realtek que vinha com algumas versões do Windows, na época W95OSR2, W98OSR2, W2000.
Vai ver esse problema de vai e volta da Microsoft continua.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DbAppend falha

Mensagempor NiltonGM » 13 Jun 2017 12:13

Devemos lembrar que o dbCommit() ou dbCommitAll() apenas atualiza (salva) as atualizações no servidor, mas não garante que a outra aplicação rodando em outra estação "verá" essa atualização e vice versa, para que isso ocorra, sempre antes de adicionar ou alterar um registro você deve fechar o arquivo e re-abri-lo novamente pegando a última atualização. (alias)->dbCloseArea() / clientes->dbCloseArea()
Nilton Medeiros
nilton@sistrom.com.br
Avatar de usuário

NiltonGM
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 393
Data de registro: 05 Jun 2014 23:47
Cidade/Estado: Caieiras/SP
Curtiu: 249 vezes
Mens.Curtidas: 24 vezes

DbAppend falha

Mensagempor JoséQuintas » 13 Jun 2017 12:52

Aí pegou pesado.
Basta o SKIP 0, de preferência antes do UNLOCK.
Tanto faz se é Clipper, Harbour, simultâneo com Visual Basic + ADS, etc.

Tentei achar a palavra COMMIT em todos os meus fontes:

commit.png


Só mesmo no backup/restore do MySQL.

Pra quem pensa que o commit é necessário... saibam que nunca usei isso.
Só uso o que está na função RecUnlock() que postei acima.
E como mostrado na função, desde 1995, há mais de 20 anos (antes era a mesma coisa sem a função)..... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DbAppend falha

Mensagempor NiltonGM » 13 Jun 2017 13:07

Boa Zéh, não sabia que o SKIP 0 fazia a releitura do arquivo dBF, de qualquer forma agora é tarde, deixei o DBF a muitos anos luz atras... agora só MySQL e gostaria muito de migrar para o PostGreSQL, infelizmente o Harbour parece ter desandado nessa direção.
Nilton Medeiros
nilton@sistrom.com.br
Avatar de usuário

NiltonGM
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 393
Data de registro: 05 Jun 2014 23:47
Cidade/Estado: Caieiras/SP
Curtiu: 249 vezes
Mens.Curtidas: 24 vezes

DbAppend falha

Mensagempor leandrolinauer » 14 Jun 2017 09:51

Bom dia.
Grato por todos os empenhos, mas creio que este seja um problema grave do DBF, visto que como já informei, só ocorre nesta loja inclusive a MATRIZ e somente neste DBF de orçamento/vendas.
Não ocorre em nenhuma outra loja.
Simplesmente o temporário é preenchido com o registro e este registro deveria em seguida ser gravado no principal, mas não grava.
Tambem ocorre que as vezes grava, mas em cima de outro registro já gravado sempre do mesmo dia e momento.
Já fiz uma modificação que eu travo um arquivo de ordens antes, para que somente este entre e faça a gravação no arquivo e que é liberado após a gravação.
Não é o servidor, visto se tratar a anos ocorrendo isto, e o qual ja foi trocado.
Creio que só migrando para SQL para resolver este problema, ou talvez acabe sendo migrado tbem, (hehehe).

Grato a todos.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 373
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

DbAppend falha

Mensagempor JoséQuintas » 14 Jun 2017 10:52

Sinceramente....
A menos que provem o contrário, considero falha dos fontes.

Simplesmente o temporário é preenchido com o registro e este registro deveria em seguida ser gravado no principal, mas não grava.


Está aí uma rotina que poderia estar com problema.

Existe algum controle sequencial? utiliza um controle de sequência ou é último+1?
No Harbour isso de último+1 não dá muito certo, dá muito mais problema do que no Clipper, não me pergunte porque.
Inclusive isso já foi comentado várias vezes.
Foi uma das mudanças que tive que fazer de Clipper pra Harbour: o controle de sequência de numeração.

O fato de matriz/filial, pode não significar muito, já que cada uma tem seu jeito de trabalhar.
Meu aplicativo é um só, pra TODOS os clientes.
O problema que mencionei sobre controle de numeração só acontecia em um deles, lógico, o que tinha mais usuários simultâneos.
Não o que tinha quantidade maior de pedidos, mas o que tinha quantidade maior de usuários cadastrando pedidos.
Por enquanto meu recorde foi em 1999, mais de 100 usuários mexendo em pedidos ao mesmo tempo, numa montadora de computadores, e controlando todas as etapas de montagem.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DbAppend falha

Mensagempor janio » 14 Jun 2017 13:01

Não ocorre em nenhuma outra loja.


Eu ja acho que vc tem um ERRO nesse DBF. Talvez copiar o seu conteúdo para um NOVO dbf com COPY TO resolva.

Poderia ser tbm um problema de disco. Mas se ocorre o erro apenas em uma tabela... meio que descarta essa possibilidade.

Erro de lógica na rotina tbm eh meio difícil que seja, ja que o sistema roda em outras lojas sem erros e suponho ser o mesmo sistema, mesma versão.

Janio

PS: Ha 2 dias NÃO recebo erro não gravação de dados no cliente. A princípio a função salvou a pátria. Aguardar...
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

Próximo



Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 10 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro