titre_site.jpg (51607 octets)

SET CARRY

 

Spécifie les champs depuis lesquels les données sont copiées vers de nouveaux enregistrements créés avec les commandes APPEND, BROWSE, EDIT et INSERT.

Syntaxe

SET CARRY on | OFF
SET CARRY TO [<liste de champs> [ADDITIVE]]

<liste de champs>

La liste de champs dont les valeurs sont transportées dans de nouveaux enregistrements.

ADDITIVE

Ajoute des champs de <liste de champs> dans la liste de champs précédemment définie avec SET CARRY TO. Sans ADDITIVE, <liste de champs> écrase la liste de champs spécifiée précédemment.

Valeur par défaut

La valeur par défaut de SET CARRY est OFF.

 

 ico_MsDos.jpg (1668 octets)  vdb5.gif (351 octets) Description


Lorsque SET CARRY est à ON, les enregistrements ajoutés en utilisant APPEND, BROWSE, EDIT ou INSERT sont remplis avec le contenu de l'enregistrement immédiatement précédent le nouvel enregistrement à la fin logique de la table. Vous pouvez aussi fournir un contenu d'enregistrement par défaut pour INSERT et APPEND en utilisant l'argument DEFAULT de @...SAY...GET.
Lorsque SET CARRY est à OFF, les nouveaux enregistrements sont initialement vides. SET CARRY n'affecte pas INSERT AUTOMEM, APPEND AUTOMEM, INSERT BLANK ou APPEND BLANK. Ces commandes ajoutent toujours un enregistrement contenant des variables automem ou un enregistrement vide.

Une liste de champs spécifiée avec la commande SET CARRY TO limite les champs transportés vers le nouvel enregistrement. L'utilisation de la commande SET CARRY TO définit automatiquement CARRY ON. Le mot réservé ADDITIVE ajoute les champs dans une liste de champs déjà définie.
SET CARRY TO sans liste de champs restaure la condition par défaut où tous les champs sont transportés vers de nouveaux enregistrements.
Vous pouvez aussi limiter les champs en spécifiant une liste de champs avec SET FIELDS TO. La liste de champs SET CARRY TO ne s'applique qu'à SET CARRY, alors que la liste de champs SET FIELDS TO s'applique à toutes les commandes fonctionnant sur les tables. Une liste de champs SET FIELDS TO remplace une liste de champs SET CARRY TO.

 

Plus2_5-Icon.jpg (1250 octets) xDML vers ooDML

La commande Xbase SET CARRY est utile en ce qu'elle permet au développeur de spécifier les champs à «porter» de la ligne actuelle à une nouvelle ligne (commande append).

Il n'y a pas d'équivalent direct en OODML pour cela. Mais Ken Mayer a créé une routine qui est dans la bibliothèque dUFLP de la base de connaissances. Le code est attaché à un bouton-poussoir dans le fichier CUSTBUTT.CC, le bouton-poussoir est appelé kmCarryPushButton. Le code est montré ci-dessous, mais il n'y a aucune garantie qu'il fonctionne si vous le copiez-collez à partir d'ici à l'événement OnClick d'un autre bouton (ceci est un code assez complexe). Le code ci-dessous a été mis à jour dans le dUFLP afin d'avoir plus de fonctionnalités, donc si vous souhaitez que le code complet, vous devriez consulter la dernière version de dUFLP.

Vous pouvez aussi consulter dans dUFLP, setcarry.prg et CopyRow.cc, toujours de Ken Mayer.

Un résumé rapide du code ci-dessous: il y a une propriété d'un champ qui peut être utilisée pour spécifier les champs, qui est une propriété personnalisée du bouton poussoir. Si elle est vide, on copie tous les champs (sauf ceux en lecture seule, les champs de verrouillage, et autres). Ceux qui sont copiés le sont dans un tableau, la méthode beginAppend du rowset est appelée, puis les valeurs du tableau sont déposées dans les champs appropriés du buffer de la nouvelle ligne.

 

function onClick
// Y-a-il un rowset sur le formulaire ?
rType = this.form.rowset
if ( TYPE( "rType" ) == "U" )
   msgbox( 'Impossible de copier le contenu des lignes, sans un rowset !',;
   "Impossible!", 16 )
   return
else
// Si c'est le cas, vérifiez l'état ensemble de lignes
// si nous sommes en édition / ajout d'une ligne
// nous ne voulons pas simplement fermer le formulaire ...
nState = this.form.rowset.state
do case
   case nState == 2 or nState == 3
   msgbox( "Sauvegardez en premier cette ligne", ;
   "Impossible de copier!", 16 )
case nState == 4
   msgbox( "Vous êtes en mode filtre",;
   "impossible d'abandonner!", 16 )
otherwise
// liste de champs (optionnel)
   if type( "this.Carry" ) == "C"
      lList = true
   else
      lList = false
   endif
// tableau utilisé pour copier la ligne courante
   aCarry = new Array()
// raccourci la référence form.rowset.fields :
   fFields = form.rowset.fields
// copie de l'enregistrement courant
   for i = 1 to fFields.size
      lAdd = true
/*
sauf pour les champs  readonly, autoincrement
ou lock (_dbaseLock)
NOTE: Les champs _dbaseLock n'ont pas de
type ou de propriétés readOnly,
Nous devons donc veiller à ce qu'ils
existent avant de vérifier ce
qu'ils contiennent ...
*/
      if ( type( "fFields[i].readOnly" ) # "U" and ;
      fFields[i].readOnly ) or ;
      ( type ( "fFields[i].type" ) # "U" and ;
      "AUTOINC" $ fFields[i].type ) or ;
      fFields[i].className == "LOCKFIELD"
      lAdd = false
   endif
// Champs non this.Carry si cela est prévu...
   if lList AND ;
   NOT upper( fFields[i].fieldName ) $ ;
      upper( this.Carry )
      lAdd = false
   endif
   if not lAdd
      aCarry.add( "* Saute ce champ *" )
   else
/*
si nous avons un lookupRowset, alors
nous avons une déclaration lookupSQL, et
nous devons nous assurer que nous stockons la
valeur qui doit être stockée, PAS
la valeur qui sera retournée par
lookupSQL ...
*/
      if fFields[i].lookupRowset # NULL
         aCarry.add( fFields[i].lookupRowset.fields[2].value )
      else
         aCarry.add( fFields[i].value )
      endif
   endif // form.rowset.fields ...
   next
// ajoute une nouvelle ligne
   form.rowset.beginAppend()
// -------------------------------
// copie les données de la ligne précédente :
   for i = 1 to fFields.size
      if aCarry[i] == "* Skip This Field *"
         loop
      else
         fFields[i].value := aCarry[i]
      endif // skip ...
   next
// réaffiche
   form.rowset.refreshControls()
// informe l'utilisateur :
   msgbox( "Enregistrement copié -- vous êtes en mode ajout"+;
   " faites les modifs et sauvegardez ou abandonnez cette nouvelle ligne.",;
   "Copie terminée", 64 )
endcase
endif
return

Une discussion intéressante sur d'autres solutions en ooDML pour imiter le fonctionnement de SET CARRY :

Groupes de discussion : dbase.programming
De : "J. Trouwborst" <no_spam_j.trouwbo...@hetnet.nl>
Date : Sun, 25 May 2003 19:36:42 +0200
Date/heure locale : Dim 25 mai 2003 19:36
Objet : Filling a row with data from previous row

et si l'allemand vous est familier (car AMHA google translator est assez restreint dans le sens allemand vers français)

Groupes de discussion : dbase.deutsch
De : "Roland Wingerter" <RWinger...@t-online.de>
Date : Tue, 9 Apr 2002 22:50:54 +0200
Date/heure locale : Mar 9 avr 2002 22:50
Objet : Re: set carry kopiert immer letzten Datensatz

 

retour

Sources :

Aide Visual dbase V5.5
http://www.dbase.com/Knowledgebase/INT/xb2vdb7oodml/x2oodml.htm

Base de connaisance dUFLP

 

Si vous voyez des erreurs, n'hésitez pas à le signaler.

Dernière modification : vendredi 06 août 2010

©  M.A.