Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function BatchMoveEx(AOrigem,ADestino: TDataSet; StopOnError : Boolean;
- AbortOnFieldNoExist : Boolean = False; bAppend : Boolean=False):Integer;
- implementation
- { BatchMoveEx criado para copiar registro de AOrigem para ADestino de forma fácil
- e dinâmica, uso este nome por que o método se assemelha ao BatchMove do Interbase
- Autor; Maicon Saraiva}
- function BatchMoveEx(AOrigem,ADestino: TDataSet; StopOnError : Boolean;
- AbortOnFieldNoExist : Boolean = False; bAppend : Boolean=False):Integer;
- var i : Integer;
- AFieldDest, AFieldO : TField;
- ListaErro : TStringList;
- begin
- {
- IMPORTANTE: Por enquanto apenas insere os registros.
- StopOnError = Se true vai abortar a operação em caso de qualquer erro.
- AbortOnFieldNoExist: Se false continua mesmo que em Destino tenha algum campo que não exista em Origem.
- //O padrão é "false" por que nem sempre Origem precisará ter os mesmos campos que destino.
- bAppend: Se True então permite que AOrigem já tenha dados (executa um append)
- IMPORTANTE/REGRAS:
- 1. ADestino e AOrigem já devem estar abertos;
- 2. ADestino não deve ter nenhum registro (você deve limpar ele antes)
- 3. Todos os campos existentes em ADestino precisam existir em AOrigem,
- quando não puder ter certeza se existe ou não, uma alternativa é setar o StopOnError para False
- 4. Já AOrigem pode até ter mais campos que o ADestino, já que ADestino pode
- não precisar de algum campo que existem em AOrigem.
- }
- try
- try
- Result := 0;
- AOrigem.DisableControls;
- ADestino.DisableControls;
- ListaErro := TStringList.Create;
- //Verificação de segurança
- if (ADestino.RecordCount>0) and (bAppend=False) then
- begin
- Raise Exception.Create('Erro na função uController_DB.BatchMoveEx. '+#13+#10+
- 'ADestino não pode ter nehum registro ao executar esta função.');
- end;
- if AOrigem.IsEmpty then
- begin
- Result := 0;
- end
- else
- begin
- AOrigem.First;
- while not AOrigem.Eof do
- begin
- try
- ADestino.Append;
- for i:=0 to AOrigem.Fields.Count-1 do
- begin
- AFieldDest := ADestino.FindField(AOrigem.Fields[i].FieldName);
- AFieldO := AOrigem.Fields[i];
- if AFieldDest=nil then //Se nil, significa que o campo não existe no destino
- begin
- {Se for para abortar caso algum campo em origem não exista em destino
- Obs: o default é "false" (não abortar), pois as vezes teremos algum campo em AOrigem que não teremos no ADestino
- IMPORTANTE: É importante verificar bem os campos antes de qualquer coisa, pois caso o campo não tenha só será emitido um alerta no modo DEBUG
- }
- if AbortOnFieldNoExist then
- Raise Exception.Create('Erro no BatchMoveEX. "'+AOrigem.Name+'", campo "'+AFieldO.FieldName
- +'" não existe no dataset de destino: "'+ADestino.Name+'"')
- else
- begin
- //Se não for abortar não faz nada, mas se estiver em modo de debug emite um alerta para o Dev.
- {$IFDEF DEBUG}
- // ListaErro.Add('Erro no BatchMove. "'+AOrigem.Name+'", campo "'+AFieldO.FieldName
- // +'" não existe no dataset de destino: "'+ADestino.Name+'"');
- {$ENDIF}
- end;
- end
- else
- try
- if AFieldDest.FieldKind=fkData then
- AFieldDest.Value := AFieldO.Value;
- except //Except no Field
- on E:Exception do
- begin
- if StopOnError then
- Raise Exception.Create(e.Message);
- end;
- end;
- end; //for
- ADestino.Post;
- {$IFDEF DEBUG}
- // Erro_IfDebug(ListaErro.Text);
- {$ENDIF}
- except //Except no Registro (geralmente no Post;)
- on E:Exception do
- begin
- if ADestino.State in [dsEdit,dsInsert] then
- ADestino.Cancel;
- if StopOnError then
- Raise Exception.Create(e.Message);
- end;
- end;
- AOrigem.Next;
- end;
- Result := ADestino.RecordCount;
- end;
- except
- on E:Exception do
- begin
- Result := -1;
- Raise Exception.Create(e.Message);
- end;
- end;
- finally
- AOrigem.EnableControls;
- ADestino.EnableControls;
- ListaErro.Free;
- end;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement