4D v16

Appeler des méthodes 4D depuis le code SQL

Accueil

 
4D v16
Appeler des méthodes 4D depuis le code SQL

Appeler des méthodes 4D depuis le code SQL  


 

 

Nous souhaitons effectuer des recherches relatives aux acteurs des films. Plus précisément, nous voulons trouver tous les films auxquels ont participé au moins 7 acteurs. Les résultats devront être triés par année.
Pour cela, nous allons utiliser une fonction 4D (Find_Nr_Of_Actors) qui, à partir d'un numéro d'ID de film reçu en paramètre, retourne le nombre d'acteurs qui ont joué dans ce film :

  `(F) Find_Nr_Of_Actors
 C_ENTIER LONG($0;$1;$vMovie_ID)
 $vMovie_ID:=$1
 CHERCHER([MOVIE_ACTOR];[MOVIE_ACTOR]Movie_ID=$vMovie_ID)<tt>
 $0:=Enregistrements trouves([MOVIE_ACTOR</tt>

Voici le code 4D correspondant à notre requête :

 TABLEAU ENTIER LONG(aSoldTickets;0)
 TABLEAU ENTIER(aMovieYear;0)
 TABLEAU ENTIER LONG(aNrActors;0)
 TABLEAU TEXTE(aTitles;0)
 TABLEAU TEXTE(aDirectors;0)
 TABLEAU TEXTE(aMedias;0)
 C_ENTIER LONG($NrOfActors;$i;$vInd)
 
 $vInd:=0
 $NrOfActors:=7
 TOUT SELECTIONNER([MOVIES])
 Boucle($i;1;Enregistrements trouves([MOVIES]))
    $vCrtActors:=Find_Nr_Of_Actors([MOVIES]ID)
    Si($vCrtActors>=$NrOfActors)
       $vInd:=$vInd+1
       INSERER DANS TABLEAU(aMovieYear;$vInd;1)
       aMovieYear{$vInd}:=[MOVIES]Year_of_Movie
       INSERER DANS TABLEAU(aTitles;$vInd;1)
       aTitles{$vInd}:=[MOVIES]Title
       INSERER DANS TABLEAU(aDirectors;$vInd;1)
       aDirectors{$vInd}:=[MOVIES]Director
       INSERER DANS TABLEAU(aMedias;$vInd;1)
       aMedias{$vInd}:=[MOVIES]Media
       INSERER DANS TABLEAU(aSoldTickets;$vInd;1)
       aSoldTickets{$vInd}:=[MOVIES]Sold_Tickets
       INSERER DANS TABLEAU(aNrActors;$vInd;1)
       aNrActors{$vInd}:=$vCrtActors
    Fin de si
    ENREGISTREMENT SUIVANT([MOVIES])
 Fin de boucle
 TRIER TABLEAU(aMovieYear;aTitles;aDirectors;aMedias;aSoldTickets;aNrActors;>)

  • En utilisant du code SQL :

     TABLEAU ENTIER LONG(aSoldTickets;0)
     TABLEAU ENTIER(aMovieYear;0)
     TABLEAU ENTIER LONG(aNrActors;0)
     TABLEAU TEXTE(aTitles;0)
     TABLEAU TEXTE(aDirectors;0)
     TABLEAU TEXTE(aMedias;0)
     C_ENTIER LONG($NrOfActors;$i;$vInd)
     
     $vInd:=0
     $NrOfActors:=7
     Debut SQL
        SELECT Year_of_Movie, Title, Director, Media, Sold_Tickets, {fn Find_Nr_Of_Actors(ID) AS NUMERIC}
        FROM MOVIES
        WHERE {fn Find_Nr_Of_Actors(ID) AS NUMERIC} >= :$NrOfActors
        ORDER BY 1
        INTO :aMovieYear, :aTitles, :aDirectors, :aMedias, :aSoldTickets, :aNrActors;
     Fin SQL

    Vous pouvez constater que nous pouvons appeler une fonction 4D à l'intérieur d'une requête SQL via la syntaxe :

    {fn NomFonction4D(paramètre) AS TypeRésultatFonction4D}.

  • En utilisant les commandes SQL génériques :

     TABLEAU ENTIER LONG(aSoldTickets;0)
     TABLEAU ENTIER(aMovieYear;0)
     TABLEAU ENTIER LONG(aNrActors;0)
     TABLEAU TEXTE(aTitles;0)
     TABLEAU TEXTE(aDirectors;0)
     TABLEAU TEXTE(aMedias;0)
     C_ENTIER LONG($NrOfActors;$i;$vInd)
     C_TEXTE($tQueryTxt)
     
     $vInd:=0
     $NrOfActors:=7
     SQL LOGIN(SQL_INTERNAL;"";"")
     $tQueryTxt:=""
     $tQueryTxt:=$tQueryTxt+"SELECT Year_of_Movie, Title, Director, Media, Sold_Tickets, {fn Find_Nr_Of_Actors(ID) AS NUMERIC}"
     $tQueryTxt:=$tQueryTxt+" FROM MOVIES"
     $tQueryTxt:=$tQueryTxt+" WHERE {fn Find_Nr_Of_Actors(ID) AS NUMERIC} >= :$NrOfActors"
     $tQueryTxt:=$tQueryTxt+" ORDER BY 1"
     SQL EXECUTER($tQueryTxt;aMovieYear;aTitles;aDirectors;aMedias;aSoldTickets;aNrActors)
     SQL CHARGER ENREGISTREMENT(SQL tous les enregistrements)
     SQL LOGOUT
  • En utilisant la commande CHERCHER PAR SQL :

     TABLEAU ENTIER LONG(aSoldTickets;0)
     TABLEAU ENTIER(aMovieYear;0)
     TABLEAU ENTIER LONG(aNrActors;0)
     TABLEAU TEXTE(aTitles;0)
     TABLEAU TEXTE(aDirectors;0)
     TABLEAU TEXTE(aMedias;0)
     C_ENTIER LONG($NrOfActors;$i;$vInd)
     
     $vInd:=0
     $NrOfActors:=7
     CHERCHER PAR SQL([MOVIES];"{fn Find_Nr_Of_Actors(ID) AS NUMERIC} >= :$NrOfActors")
     Boucle($i;1;Enregistrements trouves([MOVIES]))
        $vInd:=$vInd+1
        INSERER DANS TABLEAU(aMovieYear;$vInd;1)
        aMovieYear{$vInd}:=[MOVIES]Year_of_Movie
        INSERER DANS TABLEAU(aTitles;$vInd;1)
        aTitles{$vInd}:=[MOVIES]Title
        INSERER DANS TABLEAU(aDirectors;$vInd;1)
        aDirectors{$vInd}:=[MOVIES]Director
        INSERER DANS TABLEAU(aMedias;$vInd;1)
        aMedias{$vInd}:=[MOVIES]Media
        INSERER DANS TABLEAU(aSoldTickets;$vInd;1)
        aSoldTickets{$vInd}:=[MOVIES]Sold_Tickets
        INSERER DANS TABLEAU(aNrActors;$vInd;1)
        aNrActors{$vInd}:=Find_Nr_Of_Actors([MOVIES]ID)
        ENREGISTREMENT SUIVANT([MOVIES])
     Fin de boucle
     TRIER TABLEAU(aMovieYear;aTitles;aDirectors;aMedias;aSoldTickets;aNrActors;>)
  • En utilisant la commande SQL dynamique EXECUTE IMMEDIATE :

     TABLEAU ENTIER LONG(aSoldTickets;0)
     TABLEAU ENTIER(aMovieYear;0)
     TABLEAU ENTIER LONG(aNrActors;0)
     TABLEAU TEXTE(aTitles;0)
     TABLEAU TEXTE(aDirectors;0)
     TABLEAU TEXTE(aMedias;0)
     C_ENTIER LONG($NrOfActors;$i;$vInd)
     C_TEXTE($tQueryTxt)
     
     $vInd:=0
     $NrOfActors:=7
     $tQueryTxt:=""
     $tQueryTxt:=$tQueryTxt+"SELECT Year_of_Movie, Title, Director, Media, Sold_Tickets, {fn Find_Nr_Of_Actors(ID) AS NUMERIC}"
     $tQueryTxt:=$tQueryTxt+" FROM MOVIES"
     $tQueryTxt:=$tQueryTxt+" WHERE {fn Find_Nr_Of_Actors(ID) AS NUMERIC} >= :$NrOfActors"
     $tQueryTxt:=$tQueryTxt+" ORDER BY 1"
     $tQueryTxt:=$tQueryTxt+" INTO :aMovieYear, :aTitles, :aDirectors, :aMedias, :aSoldTickets,"+" :aNrActors;"
     Debut SQL
        EXECUTE IMMEDIATE :$tQueryTxt;
     Fin SQL

Pour tester ces exemples, lancez la base "4D SQL Code Samples" et affichez la boîte de dialogue principale. Choisissez le mode d'interrogation du moteur de 4D et cliquez sur le bouton Appel de méthode 4D.

 
PROPRIÉTÉS 

Produit : 4D
Thème : Prise en main
Nom intl. : Calling 4D methods inside the SQL code

 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

4D - Référence SQL ( 4D v16)