[firebase-br] Estou migrando dados do Fb3.0 para Fb4.0

Mário Reis mariodosreyx em gmail.com
Segunda Março 18 17:26:26 -03 2024


Enquanto os colegas continuam carregando dados na minha aplicação FB3.0 que
vou lendo para carregar novos registos no fb4.0 surgiu a necessidade de
algumas vezes em vez de fazer Insert into
table_xpto fazer um UpDate Table_Xpto.
Contudo, só quero atualizar os campos com dados diferentes (mais
atualizados, porque guardo as datas das atualizações dos campos mais
relevantes. Então preciso fazer algo como fazemos
no fazemos no Delphi, como se exemplifica
do FB30
   sSql= TRIM(
   ' SELECT '||

   ' P.PESSOA_ID, P.TITULO_ID, P.APELIDO, P.NOME, P.TIPO_ID, P.NOBI,
P.ARQIDENT, P.DATEMIBI, P.SEXO)
   ' FROM PESSOAS P '||
   ' INNER JOIN SOCIOS S ON S.SOCIOS_ID=P.PESSOA_ID '||
   ' WHERE S.NOSOC_ID >= '||TRIM(CAST( IN_ID AS VARCHAR(15)) )
   );
  FOR
   EXECUTE STATEMENT
      ( :sSql )
      ON EXTERNAL DATA SOURCE :sDB
      AS USER :IN_USER PASSWORD :IN_PWD -- just for example
      WITH COMMON TRANSACTION -- note autonomous transaction
      INTO
     :PESSOA_ID, :TITULO_ID, :APELIDO, :NOME, :TIPO_ID, :NOBI, :ARQIDENT,
:DATEMIBI, :SEXO);
-- Agora vai inserir na FB4
If row_count()=0 then
   EXECUTE PROCEDURE PESSOAS_INS(
      :PESSOA_ID,
      :TITULO_ID,
      :APELIDO,
      :NOME,
      :TIPO_ID,
      :NOBI,
      :ARQIDENT,
      :DATEMIBI,
      :SEXO)
Else
if row_count()=1 Then
 begin

For i:=o To FieldCount(()-1 Do   (* Favor ver abaixo a ideia*)
   if field[i].type= FKData then
    Set ( delphi_Field[i].Old_Data =delphi_Field[i].NewData
esta mais antiga vem do FB4:=>      PESSOA_ID=:PESSOA_ID  (onde esta mais
atual vem do FB3)
     EXECUTE PROCEDURE PESSOAS_UPD(
      :PESSOA_ID,
      :TITULO_ID,
      :APELIDO,
      :NOME,
      :TIPO_ID,
      :NOBI,
      :ARQIDENT,
      :DATEMIBI,
      :SEXO)
   Tem como na Stored Procedure de Firebird fazer aquele automático que
fazemos no delphi
Alguém tem como ajudar?

Com os meus melhores cumprimentos
Mário Agostinho Reis
919262146
Procedure AppendCurrent(Dataset:Tdataset);
VAR
  aField : Variant ;
  i      : Integer ;
BEGIN
  // create a variant Array
  aField := VarArrayCreate([0,DataSet.Fieldcount-1],VarVariant);

  // read values into the array
  for i := 0 to (DataSet.Fieldcount-1) do
   if (DataSet.fields[i].FieldKind=fkData) then // Exclusivamente campo de
dados
     aField[i] := DataSet.fields[i].Value ;

  DataSet.Append ;

  // put array values into new the record
  for i := 0 to (DataSet.Fieldcount-1) do
    if (DataSet.fields[i].FieldKind=fkData) then // Exclusivamente campo de
dados
     DataSet.fields[i].Value := aField[i] ;

end;
Esta mensagem contém informação de natureza confidencial e é
exclusivamente dirigida ao(s) destinatário(s) indicado(s). Se, por engano,
receber este email agradecemos que não o copie nem o reenvie e que nos
notifique do ocorrido através do email de resposta.


Mais detalhes sobre a lista de discussão lista