QueryBroker (rtl)

De Wiki1000
Version du 11 août 2009 à 13:10 par Syfre (discuter | contributions)
(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
Function QueryBroker(const iDatabaseURL:String; const iTraceIdentifier:String; const iClassName:String):TQuery;

Cette fonction alloue un curseur SQL.

Result Un curseur SQL sur la base de données spécifiée ou sur la base de données par défaut.
iDatabaseURL URL de la base de données dans laquelle allouer le curseur.
iTraceIdentifier Identifiant du curseur dans la trace.
iClassName Nom de classe sur laquelle mapper le résultat.

Le paramètre iClassName permet d'utiliser une vue objet de l'ensemble résultat ; si iClassName est défini le curseur allouera un objet de cette classe pour chaque ligne de l'ensemble résultat. La propriété "Instance" est alors utilisable pour accéder de manière objet aux données retournées par le curseur.

Vous devez utiliser le translateur de code SQL pour construire le code SQL de la requête.

Tip-20px.png Tip : Ces curseurs ne sont pas objets et ne doivent être utilisés que dans des cas exceptionnels; ils peuvent poser des problèmes de portabilités d'une base de données à une autre si vous ne respectez pas les règles de construction du code SQL.

Exemple

Procedure _CalculerSoldeInitial;
var
  SoldeCompte       : Currency;
  CumulDebit        : Currency;
  CumulCredit       : Currency;
  CumulDebitAutre   : Currency;
  CumulCreditAutre  : Currency;
  Ecriture          : Tecriture;
  i                 : Integer;
  ListeEcriture     : TObjectList;
  PC                : TParametreComptable;
  Query             : String;
  vEcritureEstAutre : Boolean;
  vCursor           : TSQLQuery;
  vNomTable         : String;
  vlWhereJoin       : String;
begin
  vlWhereJoin := '';
 
  _RazCumuls;
 
  if (oidCompteGeneral='') And (oidGroupePointage='') then Exit;
 
  if oidCompteGeneral <> '' then
    SoldeCompte := compteGeneral.totalDebitTenue.value - compteGeneral.totalCreditTenue.value;
  if oidGroupePointage<>'' then
    SoldeCompte := groupePointage.compteGeneral.totalDebitTenue.value - groupePointage.compteGeneral.totalCreditTenue.value ;
  soldeComptable.Value := SoldeCompte;
 
  CumulDebit  := 0.0;
  CumulCredit := 0.0;
  CumulDebitAutre  := 0.0;
  CumulCreditAutre := 0.0;
  PC:=ClassManager.FindSingleton('TParametreComptable');
  if not Assigned(PC) then
    raise ERule.Create('Les paramètres comptables ne sont pas initialisés');
 
  vCursor := QueryBroker('','Ecriture resultat','');
  vCursor.SQL.Add('SELECT SUM(TECRITURE.credit_TCValue), SUM(TECRITURE.debit_TCValue) ');
  vCursor.SQL.Add(' FROM  ');
  vNomTable := ClassManager.FindClassTableName('TECRITURE');
  vCursor.SQL.Add(vCursor.Translator.dbOutTableName(vNomTable,'TECRITURE',dbtoNO));
  vCursor.SQL.Add(vCursor.Translator.dbOutJoin('TPIECE','Piece',dbtoNoLock,'oid','TECRITURE','oidpiece',vlWhereJoin));
  vCursor.SQL.Add(vCursor.Translator.dbOutJoin('TLOT','Lot',dbtoNoLock,'oid','Piece','oidLot',vlWhereJoin));
  vCursor.SQL.Add(vCursor.Translator.dbOutLeftOuterJoin('TGROUPEPOINTAGE','GroupePointage',dbtoNoLock,'oid','TECRITURE','oidGroupePointage',vlWhereJoin));
  vCursor.SQL.Add(' WHERE ');
  vCursor.SQL.Add(' (TECRITURE.eDate <= ' + vCursor.Translator.dbOutVariant(PC.ExerciceEnCours.Datefin) + ') ');
  vCursor.SQL.Add('  AND (Lot.origineLot <> 0) ');
  if oidGroupePointage<>''
     then vCursor.SQL.Add('  AND (TECRITURE.oidcompteGeneral = ''' + GroupePointage.OidCompteGeneral + ''') ')
     else vCursor.SQL.Add('  AND (TECRITURE.oidcompteGeneral = ''' + oidCompteGeneral + ''') ');
  vCursor.SQL.Add(' AND (TECRITURE.typeEcriture <> 0) ');
  vCursor.SQL.Add(' AND ( ');
  vCursor.SQL.Add(' (GroupePointage.datePointage >= ' + vCursor.Translator.dbOutVariant(datePointage)+ ')');
  vCursor.SQL.Add('  OR (GroupePointage.datePointage IS NULL)');
  vCursor.SQL.Add(' ) ');
  vCursor.Open;
  vCursor.First;
  while not(vCursor.EOF) do
  begin
    CumulCredit := vCursor.Fields[0].AsVariant;
    CumulDebit  := vCursor.Fields[1].AsVariant;
    vCursor.next;
  end;
  vCursor.Close;
 
  if Assigned(GroupePointage) then
  begin
    if uniquementEcrituresGroupe then
      begin
        CumulCreditAutre := CumulCredit;
        CumulDebitAutre  := CumulDebit;
      end;
  end
  else
  begin
    // cursor pour autres écritures
    vCursor := QueryBroker('','Ecriture resultat','');
    vCursor.SQL.Add('SELECT SUM(TECRITURE.credit_TCValue), SUM(TECRITURE.debit_TCValue) ');
    vCursor.SQL.Add(' FROM  ');
    vNomTable := ClassManager.FindClassTableName('TECRITURE');
    vCursor.SQL.Add(vCursor.Translator.dbOutTableName(vNomTable,'TECRITURE',dbtoNO));
    vCursor.SQL.Add(vCursor.Translator.dbOutJoin('TPIECE','Piece',dbtoNoLock,'oid','TECRITURE','oidpiece',vlWhereJoin));
    vCursor.SQL.Add(vCursor.Translator.dbOutJoin('TLOT','Lot',dbtoNoLock,'oid','Piece','oidLot',vlWhereJoin));
    vCursor.SQL.Add(vCursor.Translator.dbOutLeftOuterJoin('TGROUPEPOINTAGE','GroupePointage',dbtoNoLock,'oid','TECRITURE','oidGroupePointage',vlWhereJoin));
    vCursor.SQL.Add(' WHERE ');
    vCursor.SQL.Add(' (TECRITURE.eDate <= ' + vCursor.Translator.dbOutVariant(PC.ExerciceEnCours.Datefin) + ') ');
    vCursor.SQL.Add(' AND (TECRITURE.eDate < ' + vCursor.Translator.dbOutVariant(DateDebut) + ') ');
    vCursor.SQL.Add(' AND (TECRITURE.eDate <= ' + vCursor.Translator.dbOutVariant(Datefin) + ') ');
    vCursor.SQL.Add('  AND (Lot.origineLot <> 0) ');
    if oidGroupePointage<>'' then
      vCursor.SQL.Add('  AND (TECRITURE.oidcompteGeneral = ''' + GroupePointage.OidCompteGeneral + ''') ')
    else
      vCursor.SQL.Add('  AND (TECRITURE.oidcompteGeneral = ''' + oidCompteGeneral + ''') ');
    vCursor.SQL.Add(' AND (TECRITURE.typeEcriture <> 0) ');
    vCursor.SQL.Add(' AND ( ');
    vCursor.SQL.Add(' (GroupePointage.datePointage > ' + vCursor.Translator.dbOutVariant(datePointage)+ ')');
    vCursor.SQL.Add(' ) ');
    vCursor.Open;
    vCursor.First;
    while not(vCursor.EOF) do
    begin
      CumulCreditAutre := vCursor.Fields[0].AsVariant;
      CumulDebitAutre  := vCursor.Fields[1].AsVariant;
      vCursor.next;
    end;
    vCursor.Close;
  end;
 
  debitPointeAutre.Value := CumulDebitAutre;
  creditPointeAutre.Value := CumulCreditAutre;
  debitNonPointe.Value := CumulDebit;
  creditNonPointe.Value := CumulCredit;
  soldeTheorique.Value := SoldeCompte - CumulDebit + CumulCredit;
  soldeInitial.value :=  SoldeCompte - CumulDebit + CumulCredit;
end;

Voir aussi:

Développement DSMDéveloppement DSM

Outils personnels