Clipper On Line • Ver Tópico - ADO, atualizar o registro.

ADO, atualizar o registro.

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

Moderador: Moderadores

 

ADO, atualizar o registro.

Mensagempor Itamar M. Lins Jr. » 30 Abr 2020 22:58

Ola!
*-----------------------------------------------------------------------------*
METHOD Update() CLASS DBADO
*-----------------------------------------------------------------------------*
Local oErr, lRet := .T., OleError
   TRY
      IF ::oRs:LockType = adLockBatchOptimistic
         If !::EOF
            ::oRs:UpdateBatch()
         Endif
      ELSE
         ::oRs:Update()
      ENDIF
   CATCH oErr
//      lRet := MyDefError(oErr, .F., self)  // Mi manejadr de errores
      OleError := ::oRs:ActiveConnection:Errors[0]
      MsgStop(oErr:Description+hb_OsNewLine()+"Native Error "+STR(OleError:NativeError),"Error al guardar")
      lRet := .F.
   END
Return lRet


O ADO cuida de tudo isso, se eu tiver um RecordSet armado com o comando oRs: = chave SELECT, nome, endereço FROM clientes se quiser alterar o nome, só preciso fazer oRs: Campos (1): Valor: = new_name ou usando ado .prg (acabei de compartilhar um link para download) Posso executar oRs: Nome: = new_name, então oRs: Update () e pronto, ele é atualizado no banco de dados.


Usando ADO, basta atualizar o field via x:value := "X..." depois oRS:update() que atualiza ?
Não precisamos usar comandos SQL "insert into..., UPDATE..." ? se for assim tá legal.

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

ADO, atualizar o registro.

Mensagempor JoséQuintas » 30 Abr 2020 23:41

Itamar M. Lins Jr. escreveu:Usando ADO, basta atualizar o field via x:value := "X..." depois oRS:update() que atualiza ?
Não precisamos usar comandos SQL "insert into..., UPDATE..." ?
se for assim tá legal.


Isso mesmo, mas depende do ODBC ser totalmente compatível.
Inclusive no VB fica mais integrado, pode-se usar RS!Codigo ao invés de RS.Fields( "código" ).Value
Mas depende do ODBC estar completo, do fabricante ter liberado tudo.
Na dúvida melhor SQL mesmo.

https://ns7.webmasters.com/caspdoc/html/ado_recordset_object_update_method.htm

` Change data in edit buffer. 
rstEmployees!fname = "Linda"
rstEmployees!lname = "Kobara"
` Show contents of buffer and get user input.
strMessage = "Edit in progress:" & vbCr & _
" Original data = " & strOldFirst & " " & _
strOldLast & vbCr & " Data in buffer = " & _
rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _
"Use Update to replace the original data with " & _
"the buffered data in the Recordset?"
If MsgBox(strMessage, vbYesNo) = vbYes Then
   rstEmployees.Update
Else
   rstEmployees.CancelUpdate
End If


Nota: considerar rstEmployees!fname como rstEmployess:Fields( fname ):Value
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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

ADO, atualizar o registro.

Mensagempor JoséQuintas » 01 Mai 2020 13:41

Tem mais que isso:

No Access existe a opção de VINCULAR DBF ao banco Access, através de ADO, ou qualquer outra base de dados.
Ou seja... o Harbour poderia trabalhar normalmente com o MDB, como um banco Access comum, mas estar atualizando qualquer outra base de dados.

O Harbour tem LIB pra trazer as coisas pra formato DBF ou formato array
O ADO trás pra formato ADO
O Access trás pra formato Access
E por aí vai.

No final expande as opções:

O programador precisa decidir se quer trabalhar com formato array, DBF, ADO, SQL, misto, etc.
Depois/durante a decisão, pode escolher o conector que vai usar e/ou LIB que vai usar.
Nada impede de testar várias opções até mesmo ao mesmo tempo.
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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

ADO, atualizar o registro.

Mensagempor alxsts » 01 Mai 2020 18:50

Olá!

Depende de como o recordset foi criado (método Open).
Valor/Constante Tipo/Descrição

3 / adOpenStatic
Define um cursor do tipo Static. Um cursor deste tipo contém uma cópia estática dos registros. O conteúdo do RecordSet é definido no momento da criação do mesmo. Caso sejam feitas alterações no Banco de dados, estas alterações não serão visíveis para o RecordSet que utiliza um cursor do tipo Static. Somente recriando o RecordSet é que poderemos ter acesso as alterações efetuadas. Podemos movimentar o ponteiro de registro em ambas as direções, isto é, podemos utilizar os métodos MoveNext, MovePrevious e assim por diante.

0 / adOpenForwardOnly
Cria um cursor do tipo Forward Only. Este é o valor padrão que será utilizado caso não seja definido nenhum outro tipo. Somente podemos utilizar o método MoveNext. Se tentarmos utilizar um outro método de movimentação, será gerado um erro e a página não será carregada. Também é um cursor do tipo Static, com a diferença que somente podemos nos movimentar para a frente.

2 / adOpenDynamic
Cria um cursor do tipo Dynamic. Um cursor deste tipo não possui um conjunto fixo de registros. Quaisquer alterações, adições e exclusões feitas por outros usuários serão visíveis para o objeto RecordSet, sem que o mesmo tenha que ser eliminado e recriado. Podemos nos movimentar em ambas as direções dentro do RecordSet.

1 / adOpenKeyset
Cria um cursor do tipo Keyset. Um cursor deste tipo é parecido com um cursor Dynamic, com a exceção de que o conjunto de registros é fixo. O RecordSet enxerga as alterações feitas por outros usuários, porem a adição de novos registros não é visível para um RecordSet do tipo Keyset. Caso algum registro seja eliminado por outros usuários, o respectivo registro estará inacessível no RecordSet. Podemos nos movimentar em ambas as direções dentro do RecordSet.
Fonte: Júlio Battisti
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

ADO, atualizar o registro.

Mensagempor Itamar M. Lins Jr. » 02 Mai 2020 14:46

Ola!
Vendo com calma, tem vantagens e desvantagens.
A vantagem principal que vejo é para quem está migrando do DBF, trabalhar de forma igual mas com BD relacional.
A desvantagem é ficar fora do padrão, totalmente preso sem saber usar os outros comandos, SQL, INSERT, UPDATE.
O SQLMIX obriga usar os comandos SQL, para gravar, incluir e ler.
Algumas pessoas acham isso um incomodo, pois não querem digitar as longas "QUERYES", ... INSERT INTO bla,bla,bla... mas isso lá na frente tem um ganho pq já fica pronto para qualquer linguagem "OFF WINDOWS". E um maior controle, sem as falhas "possíveis" desta técnica particular do ADO, conforme relato do José Quintas. Seria a mesma coisa de usar ADO igual a DBF, ai o sujeito trocou 6 por meia dúzia.

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

ADO, atualizar o registro.

Mensagempor Itamar M. Lins Jr. » 02 Mai 2020 14:51

Ola!
Depende de como o recordset foi criado (método Open).

Deve está desatualizado.
rs.CursorLocation=adUseClient
rs.CursorType=adOpenStatic
rs.LockType=adLockBatchOptimistic

adUseClient 3 Uses a client-side cursor supplied by a local cursor library. For backward compatibility, the synonym adUseClientBatch is also supported

oC := win_oleCreateObject( "ADODB.Connection" )
   oC:CursorLocation := adUseClient
   oC:ConnectionTimeout := 10
   oC:CommandTimeOut := 15 //30

   DO CASE
   CASE Engine  == "MARIADB"
      nOption := 3+4194304+67108864   // dont know + auto_reconect + multiple_statementes_allowed
      sconection := "Provider=MSDASQL;Driver={MariaDB ODBC 3.0 Driver};" + ;
                     "Server=" + Server + ;
                     ";Database=" + Database + ;
                     ";User=" + User + ;
                     ";Password=" + Pass + ;
                     ";Option="+str(INT(nOption))+if(Port <> NIL, ";Port="+Port ,";")
   


Essa é a forma que não precisa usar SQL, é tratado igual a DBF. oRS:Update() grava do bando de dados.

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




Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 11 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