IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Composant dataset et requête paramétrée


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 83
    Points : 64
    Points
    64
    Par défaut Composant dataset et requête paramétrée
    Bonjour a tous,
    je ne comprend pas pourquoi mon dataset est vide lorsque je décide de paramètrer ma requête
    je vous explique :

    dans un evenement formCreate j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    procedure TFacturation.FormCreate(Sender: TObject);
    var
     
    NumeroClient,NumeroPiece,rqDerNumEch,rqCreerEcheance,rqLierPiece,rqMoisfacturation : string;
    NumEcheance,DernierNumEcheance,NumMois,Annee : integer;
    begin
    ConnexionDATAFAC.Connected := true;
    DataSetRemplirDBGrid.Active := true;
    RVProject1.ProjectFile := ExtractFilePath(Application.ExeName) + 'Project4.rav';
    //test de du mois en cour ( si janvier 2009 mois facturation decembre 2008 )
    rqMoisfacturation := 'SELECT MOIS_FACTURATION,ANNEE_FACTURATION FROM PARAM';
    ADOQueryMoisFacturation.Close;
    ADOQueryMoisFacturation.SQL.Clear;
    ADOQueryMoisFacturation.SQL.Add(rqMoisFacturation);
    ADOQueryMoisFacturation.Open;
    NumMois := ADOQueryMoisFacturation.Fields[0].Value;
    Annee :=  ADOQueryMoisFacturation.Fields[1].Value;
    if NumMois =1 then
    begin
        DataSetRemplirDBGrid.Parameters.ParamByName('MoisFacturation').Value := 12;
        DataSetRemplirDBGrid.Parameters.ParamByName('AnneeFacturation').Value := Annee-1;
    end
    else
    begin
        DataSetRemplirDBGrid.Parameters.ParamByName('MoisFacturation').Value := NumMois-1;
        DataSetRemplirDBGrid.Parameters.ParamByName('AnneeFacturation').Value := Annee;
    end;
    while not DataSetRemplirDBGrid.Eof do
      begin
            if DataSetRemplirDBGrid.Fields[4].IsNull or  DataSetRemplirDBGrid.Fields[5].IsNull  then
            begin
              //recupèrer du numéro de client sur lequel les champs
              //ne sont pas renseignés
              NumeroClient := DataSetRemplirDBGrid.Fields[1].AsString;
              //recupèrer le numéro de la piece pour laquelle
              //le numéro d'echeance n'est pas renseigné
              NumeroPiece := copy(DataSetRemplirDBGrid.Fields[0].AsString,6,4);
              //recupèrer le dernier numéro d'echeance
              rqDerNumEch :='SELECT MAX(NUM_ECH) FROM ECHEANCE';
              ADOQueryNumEch.Close;
              ADOQueryNumEch.SQL.Clear;
              ADOQueryNumEch.SQL.Add(rqDerNumEch);
              ADOQueryNumEch.Open;
              DernierNumEcheance := ADOQueryNumEch.Fields[0].AsInteger;
              NumEcheance := DernierNumEcheance+1;
              //creer une echeance pour cette facture
              rqCreerEcheance := 'INSERT INTO ECHEANCE VALUES('+IntToStr(NumEcheance)+',-1,-1,'+NumeroClient+')';
              ADOQueryCreerEch.Close;
              ADOQueryCreerEch.SQL.Clear;
              ADOQueryCreerEch.SQL.Add(rqCreerEcheance);
              ADOQueryCreerEch.ExecSQL;
              //faire le lien avec la piece
              rqLierPiece :='UPDATE PIECE SET NUM_ECH = '+IntToStr(NumEcheance)+' WHERE NUM_PIE= '+NumeroPiece+' AND TYPE_PIE= '+QuotedStr('F')+'';
              ADOQueryLierPiece.Close;
              ADOQueryLierPiece.SQL.Clear;
              ADOQueryLierPiece.SQL.Add(rqLierPiece);
              ADOQueryLierPiece.ExecSQL;
            end;
            DataSetRemplirDBGrid.Next;
      end;
     //rafraichir le dbgrid
    DataSetRemplirDBGrid.Active:=false;
    DataSetRemplirDBGrid.Active:=true;
    //cacher le colonnes
    DBGridFacturation.Columns[0].Visible:=false;
    DBGridFacturation.Columns[1].Visible:=false;
    //dimensionnement de colones
    DBGridFacturation.Columns[0].Width := 100;
    DBGridFacturation.Columns[1].Width := 69;
    DBGridFacturation.Columns[2].Width := 200;
    DBGridFacturation.Columns[3].Width := 170;
    DBGridFacturation.Columns[4].Width := 80;
    DBGridFacturation.Columns[5].Width := 80;
    DBGridFacturation.Columns[6].Width := 70;
    end;
    je suis debutant alors pas trop de critique sur le code svp

    bref,mon but est d'afficher les factures du mois précedent afin de les 'recopiées' pour le mois suivant car se sont de facture automatiques et recurentes chaque mois
    le fait est que lorsque l'on est en janvier 2009 et bien il faut afficher celle de decembre 2008 d'où la première partie de mon code.

    ensuite je cherche a mettre une valeur par defaut facilement reconnaissable pour une echeance non renseignée( -1).

    j'ai un composant connection,un dataset et une datasource ainsi qu'un dbgrid pour afficher tout ça.
    Ma requête dans le data set est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  P.TYPE_PIE||'2610'|| P.NUM_PIE as "Numéro Facture ",C.NUM_CLI as "Numéro client", C.RS_CLI as "Raison social", P.REFERENCE_CLIENT_PIE as "Référence" ,ECH.NB_MOIS_TOTAL as "Echeance totale",ECH.NB_MOIS_PAYE as "Nombre de mois payés",P.MONTANT_HT_PIE as "Montant HT"
    FROM PIECE P JOIN CLIENT C ON P.NUM_CLI = C.NUM_CLI
    FULL JOIN ECHEANCE ECH ON P.NUM_ECH = ECH.NUM_ECH
    JOIN CONDITION_REGLEMENT CR ON P.NUM_CRE = CR.NUM_CRE
    WHERE P.NUM_CRE = 83
    and P.NUM_MPA = 62
    and YEAR(DATE_ECHEANCE_PIE)= :AnneeFacturation
    and MONTH(DATE_ECHEANCE_PIE)= :MoisFacturation
    order by P.NUM_PIE
    donc pour finir je disais au debut que mon dataset est vide car j'ait fait tout les tests possibles et immaginable pour me rendre compte que tout fonctionne sauf quand je met des paramètres a cette requête de plus je dit vide car a l'instruction 'while not DataSetRemplirDBGrid.Eof do' la valeur est tout le temps et donc mon traitement sur les valeures nulles ne se fait pas

    Auriez vous une idée?
    Je remercie d'avance tous ceux qui auront la patience de me lire et d'étudier mon problème

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Le DataSet DataSetRemplirDBGrid n'est pas ouvert dans le code que vous avez fournit, c'est à priori pour ça que vous n'avez pas de ligne. Il devrait y avoir un appel à DataSetRemplirDBGrid.Open après le renseignement des paramètres.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 83
    Points : 64
    Points
    64
    Par défaut
    Malheureusement même en rajoutant cette ligne de code après le renseignement des parmêtres comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if NumMois =1 then
    begin
        DataSetRemplirDBGrid.Parameters.ParamByName('MoisFacturation').Value := 12;
        DataSetRemplirDBGrid.Parameters.ParamByName('AnneeFacturation').Value := Annee-1;
        DataSetRemplirDBGrid.Open;
    end
    cela ne fonctionne toujours pas

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Moi je mettrais le Open plutôt ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if NumMois =1 then
    begin
        DataSetRemplirDBGrid.Parameters.ParamByName('MoisFacturation').Value := 12;
        DataSetRemplirDBGrid.Parameters.ParamByName('AnneeFacturation').Value := Annee-1;
    end
    else
    begin
        DataSetRemplirDBGrid.Parameters.ParamByName('MoisFacturation').Value := NumMois-1;
        DataSetRemplirDBGrid.Parameters.ParamByName('AnneeFacturation').Value := Annee;
    end;
    DataSetRemplirDBGrid.Open;
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 83
    Points : 64
    Points
    64
    Par défaut
    oui je m'excuse de ne pas avoir factorisé cette expression mais c'etait plus rapide, en revanche j'ai evidemment testé cette solution qui ne m'apporte aucun changement

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Euh, ton Dataset est bien rattaché à la base de données ?

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Haa mais attends j'avais pas vu, après ton while not Eof tu fais un DataSetRemplirDBGrid.Active:=false;
    DataSetRemplirDBGrid.Active:=true;

    Ce qui évidemment ferme le DataSet mais ne le fait pas se réouvrir, tu dois mettre un Open ici également.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 83
    Points : 64
    Points
    64
    Par défaut
    Trouvé

    je ne sais pas tellement pourquoi mais lorsque que je renseigne manuellement la command text juste avant de paramètré ma requête cela fonctionne.
    j'insisterais sur le juste avant le renseignement des paramètre car si je factorise ces lignes de codes pour les mettre juste après la structure if...else cela ne fonctionne pas.

    voici le code pour ceux que ça interesse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    procedure TFacturation.FormCreate(Sender: TObject);
    var
     
    NumeroClient,NumeroPiece,rqDerNumEch,rqCreerEcheance,rqLierPiece,rqMoisfacturation : string;
    NumEcheance,DernierNumEcheance,NumMois,Annee : integer;
    begin
    ConnexionDATAFAC.Connected := true;
    DataSetRemplirDBGrid.Active := false;
     
    RVProject1.ProjectFile := ExtractFilePath(Application.ExeName) + 'Project4.rav';
    //test de du mois en cour ( si janvier 2009 mois facturation decembre 2008 )
    rqMoisfacturation := 'SELECT MOIS_FACTURATION,ANNEE_FACTURATION FROM PARAM';
    ADOQueryMoisFacturation.Close;
    ADOQueryMoisFacturation.SQL.Clear;
    ADOQueryMoisFacturation.SQL.Add(rqMoisFacturation);
    ADOQueryMoisFacturation.Open;
    NumMois := ADOQueryMoisFacturation.Fields[0].Value;
    Annee :=  ADOQueryMoisFacturation.Fields[1].Value;
     
    if NumMois =1 then
    begin
        DataSetRemplirDBGrid.CommandText := 'SELECT  P.TYPE_PIE||'+QuotedStr('2610')+'|| P.NUM_PIE as "Numéro Facture ",C.NUM_CLI as "Numéro client", C.RS_CLI as "Raison social", P.REFERENCE_CLIENT_PIE as "Référence" ,ECH.NB_MOIS_TOTAL as "Echeance totale",ECH.NB_MOIS_PAYE as "Nombre de mois payés",P.MONTANT_HT_PIE as "Montant HT" ';
        DataSetRemplirDBGrid.CommandText := DataSetRemplirDBGrid.CommandText + ' FROM PIECE P JOIN CLIENT C ON P.NUM_CLI = C.NUM_CLI FULL JOIN ECHEANCE ECH ON P.NUM_ECH = ECH.NUM_ECH JOIN CONDITION_REGLEMENT CR ON P.NUM_CRE = CR.NUM_CRE ';
        DataSetRemplirDBGrid.CommandText := DataSetRemplirDBGrid.CommandText + ' WHERE P.NUM_CRE = 83 and P.NUM_MPA = 62 and YEAR(DATE_ECHEANCE_PIE)= :AnneeFacturation  and MONTH(DATE_ECHEANCE_PIE)= :MoisFacturation  order by P.NUM_PIE';
        DataSetRemplirDBGrid.Parameters.ParamByName('MoisFacturation').Value := 12;
        DataSetRemplirDBGrid.Parameters.ParamByName('AnneeFacturation').Value := Annee-1;
    end
    else
    begin
        DataSetRemplirDBGrid.CommandText := 'SELECT  P.TYPE_PIE||'+QuotedStr('2610')+'|| P.NUM_PIE as "Numéro Facture ",C.NUM_CLI as "Numéro client", C.RS_CLI as "Raison social", P.REFERENCE_CLIENT_PIE as "Référence" ,ECH.NB_MOIS_TOTAL as "Echeance totale",ECH.NB_MOIS_PAYE as "Nombre de mois payés",P.MONTANT_HT_PIE as "Montant HT" ';
        DataSetRemplirDBGrid.CommandText := DataSetRemplirDBGrid.CommandText + ' FROM PIECE P JOIN CLIENT C ON P.NUM_CLI = C.NUM_CLI FULL JOIN ECHEANCE ECH ON P.NUM_ECH = ECH.NUM_ECH JOIN CONDITION_REGLEMENT CR ON P.NUM_CRE = CR.NUM_CRE ';
        DataSetRemplirDBGrid.CommandText := DataSetRemplirDBGrid.CommandText + ' WHERE P.NUM_CRE = 83 and P.NUM_MPA = 62 and YEAR(DATE_ECHEANCE_PIE)= :AnneeFacturation  and MONTH(DATE_ECHEANCE_PIE)= :MoisFacturation  order by P.NUM_PIE';
        DataSetRemplirDBGrid.Parameters.ParamByName('MoisFacturation').Value := NumMois-2;
        DataSetRemplirDBGrid.Parameters.ParamByName('AnneeFacturation').Value := Annee;
    end;
     
    DataSetRemplirDBGrid.Active := true;
    DataSetRemplirDBGrid.Open;
    while not DataSetRemplirDBGrid.Eof do
      begin
            if DataSetRemplirDBGrid.Fields[4].IsNull or  DataSetRemplirDBGrid.Fields[5].IsNull  then
            begin
              //recupèrer du numéro de client sur lequel les champs
              //ne sont pas renseignés
              NumeroClient := DataSetRemplirDBGrid.Fields[1].AsString;
              //recupèrer le numéro de la piece pour laquelle
              //le numéro d'echeance n'est pas renseigné
              NumeroPiece := copy(DataSetRemplirDBGrid.Fields[0].AsString,6,4);
              //recupèrer le dernier numéro d'echeance
              rqDerNumEch :='SELECT MAX(NUM_ECH) FROM ECHEANCE';
              ADOQueryNumEch.Close;
              ADOQueryNumEch.SQL.Clear;
              ADOQueryNumEch.SQL.Add(rqDerNumEch);
              ADOQueryNumEch.Open;
              DernierNumEcheance := ADOQueryNumEch.Fields[0].AsInteger;
              NumEcheance := DernierNumEcheance+1;
              //creer une echeance pour cette facture
              rqCreerEcheance := 'INSERT INTO ECHEANCE VALUES('+IntToStr(NumEcheance)+',-1,-1,'+NumeroClient+')';
              ADOQueryCreerEch.Close;
              ADOQueryCreerEch.SQL.Clear;
              ADOQueryCreerEch.SQL.Add(rqCreerEcheance);
              ADOQueryCreerEch.ExecSQL;
              //faire le lien avec la piece
              rqLierPiece :='UPDATE PIECE SET NUM_ECH = '+IntToStr(NumEcheance)+' WHERE NUM_PIE= '+NumeroPiece+' AND TYPE_PIE= '+QuotedStr('F')+'';
              ADOQueryLierPiece.Close;
              ADOQueryLierPiece.SQL.Clear;
              ADOQueryLierPiece.SQL.Add(rqLierPiece);
              ADOQueryLierPiece.ExecSQL;
            end;
            DataSetRemplirDBGrid.Next;
      end;
     //rafraichir le dbgrid
    DataSetRemplirDBGrid.Active:=false;
    DataSetRemplirDBGrid.Active:=true;
    //cacher le colonnes
    DBGridFacturation.Columns[0].Visible:=false;
    DBGridFacturation.Columns[1].Visible:=false;
    //dimensionnement de colones
    DBGridFacturation.Columns[0].Width := 100;
    DBGridFacturation.Columns[1].Width := 69;
    DBGridFacturation.Columns[2].Width := 200;
    DBGridFacturation.Columns[3].Width := 170;
    DBGridFacturation.Columns[4].Width := 80;
    DBGridFacturation.Columns[5].Width := 80;
    DBGridFacturation.Columns[6].Width := 70;
    end;
    En revanche si quelqu'un a la connaissance technique pour m'expliquer le pourquoi du comment je suis tout ouïe.

    En tout cas merci de vous être penché sur mon problème

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/04/2010, 01h31
  2. Requête paramétrée
    Par lou.souleu dans le forum Access
    Réponses: 2
    Dernier message: 22/06/2005, 05h36
  3. [VB.NET] [ADO.NET] Requête paramétrée
    Par DotNET74 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/03/2005, 08h39
  4. Requête paramétrée qui remplit une DBLookUpComboBox
    Par navis84 dans le forum Bases de données
    Réponses: 6
    Dernier message: 02/12/2004, 21h23
  5. VBA & Requête paramétrée
    Par gripoil dans le forum Access
    Réponses: 4
    Dernier message: 25/11/2004, 09h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo