1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
| // Mapping
type
TSourceDestinationMapping = (...censored ...);
TSourceMappingData = record
SourceName : string; // Champ dans la Table Source
DestinationName: string; // Champ dans la Table Destination
SourceValue: string; // Champ qui sera comparé au Champ Source
DestinationValue: string; // Champ qui sera affecté au Champ Destination
RelationName: string; // Champ dans la Table Source qui sert pour un Test
end;
TSourceMappingSetter = procedure(const Item: TSourceMappingData; const Source, Destination: TDataSet);
TSourceMappingWrapper = record
SetProc: TSourceMappingSetter; // Procédure d'Affectation du Champ Destination
Data: TSourceMappingData;
end;
// Test si le Champ Destination est Vide, car on ne doit pas l'écraser
function IsEmptyDest(DestinationField: TField): Boolean;
begin
Result := DestinationField.IsNull or (Trim(DestinationField.AsString) = '');
end;
// Affectation Simple
procedure StandardSetter(const Item: TSourceMappingData; const Source, Destination: TDataSet);
var
SourceField, DestinationField: TField;
begin
SourceField := Source.FindField(Item.SourceName);
DestinationField := Destination.FindField(Item.DestinationName);
if Assigned(SourceField) and Assigned(DestinationField) and not SourceField.IsNull and IsEmptyDest(DestinationField) then
DestinationField.AsVariant := SourceField.AsVariant;
end;
// Affectation d'une Constante en fonction de la Valeur de la Source
procedure TestConstSetter(const Item: TSourceMappingData; const Source, Destination: TDataSet);
var
SourceField, DestinationField: TField;
begin
SourceField := Source.FindField(Item.SourceName);
DestinationField := Destination.FindField(Item.DestinationName);
if Assigned(SourceField) and Assigned(DestinationField) and not SourceField.IsNull and IsEmptyDest(DestinationField) then
begin
if SourceField.AsString = Item.SourceValue then
DestinationField.AsVariant := Item.DestinationValue;
end;
end;
// Affectation en fonction de la Valeur d'un autre Champ de la Source
procedure RelativeSetter(const Item: TSourceMappingData; const Source, Destination: TDataSet);
var
SourceField, DestinationField, RelationField: TField;
begin
SourceField := Source.FindField(Item.SourceName);
DestinationField := Destination.FindField(Item.DestinationName);
RelationField := Source.FindField(Item.RelationName);
if Assigned(SourceField) and Assigned(DestinationField) and Assigned(RelationField) and not SourceField.IsNull and IsEmptyDest(DestinationField) then
begin
if RelationField.AsString = Item.SourceValue then
DestinationField.AsVariant := SourceField.AsVariant;
end;
end;
// Affectation Simple mais Retire le Point de l'ADICAP ou CIM10
procedure WithoutPointSetter(const Item: TSourceMappingData; const Source, Destination: TDataSet);
var
SourceField, DestinationField: TField;
begin
SourceField := Source.FindField(Item.SourceName);
DestinationField := Destination.FindField(Item.DestinationName);
if Assigned(SourceField) and Assigned(DestinationField) and not SourceField.IsNull and IsEmptyDest(DestinationField) then
DestinationField.AsString := AnsiReplaceText(SourceField.AsVariant, '.', '');
end;
const
Source_MAPPING : array[TSourceDestinationMapping] of TSourceMappingWrapper =
(
(SetProc: WithoutPointSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: WithoutPointSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: WithoutPointSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: WithoutPointSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )), // Valeur Plus Significative que censored
(SetProc: RelativeSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; SourceValue: 'O'; RelationName: 'censored')),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: TestConstSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; SourceValue: 'O'; DestinationValue: 'O')),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )), // Valeur Plus Significative que censored
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: TestConstSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; SourceValue: 'O'; DestinationValue: 'A')),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: TestConstSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; SourceValue: 'O'; DestinationValue: 'I')),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; )),
(SetProc: StandardSetter; Data : (SourceName: 'censored'; DestinationName: 'censored'; ))
);
procedure TfCensored.RecopieChampsEnCommun(Source, Destination: tEpcMyDataset);
var
iField: integer;
iMapping: TSourceDestinationMapping;
...
Editing: Boolean;
begin
Editing := Destination.State in [dsEdit, dsInsert];
if not Editing then
Destination.Edit; // Travail sur la ligne en cours
// Ancienne ou Nouvelle Version de Source ?
if (GetGlobal('Source', 'VER_SUP_0999', 'N') = 'O') then
begin
// Copie des Champs de la Table Source vers une Autre Table selon le Mapping
for iMapping := Low(iMapping) to High(iMapping) do
Source_MAPPING[iMapping].SetProc(Source_MAPPING[iMapping].Data, Source, Destination);
end else
begin
// Ancien Mapping (Corrigé ? )
for iField := 0 to Source.FieldCount - 1 do
begin
if Destination.FieldNum(Source.Fields[iField].FieldName) > 0 then
begin
if (Trim(Source.Fields[iField].AsString) <> '')
and (Destination.FieldByName(Source.Fields[iField].FieldName).isNull
or (Trim(Destination.FieldByName(Source.Fields[iField].FieldName).AsString) = '')) then
begin
if epcPos(Source.Fields[iField].FieldName, '...|...|...|...') then
begin
Destination.FieldByName(Source.Fields[iField].FieldName).AsString
:= AnsiReplaceText(Source.FieldByName(Source.Fields[iField].FieldName).AsString, '.', '');
end else
begin
Destination.FieldByName(Source.Fields[iField].FieldName).AsString
:= Source.FieldByName(Source.Fields[iField].FieldName).AsString;
end;
end;
end;
end;
end;
// Calcul ...
Destination.Post();
if Editing then
Destination.Edit();
end; |