ADO SLQ UserForm Excel => Table Access MODIFY

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour à tous, et tout spécialement à nos cher 'ADOs' les Michel & Cie !!! ;)


Bonjour, toujours pas vraiment de temps pour faire des démos pour vous en ce mois de Juin, je dois finir un truc énorme pour début Juillet et je suis on ne peut plus à la bourre !

Mon problème of Today est sur ADO / SQL... J'ai bien entendu exploré les liens très interressants de MichelXLD et je fais la Pub of Course pour son Excellent WIKI :

Bienvenue sur la Wiki Page 6 de Michel Xld

NB Raffraichir la Page ou re-Cliquer sur OK de la barre d'adresse URL, car l'XML pose un problème à la premère ouverture.

Bien entendu j'ai aussi suivi cet Excellent Fil de Discussion :

Lien supprimé

Que je conseille de mettre dans les Favoris aussi ;)

Mais voilà, je suis ultra à la bourre et je cherche à faire ceci :

Voici le Sinopsis :

Les outils en action :
[li] 1) AS400 vers Access Par DataSet Vision pour une base de traitement d'info journalière[/li]
[li] 2) Access vers Excel par ADO / VBA sous UserForm et traitement par VBA [/li]
[li] 3) Retour des informations traîtées par Excel vers AS400 par Import de batch TXT en fixed Lenght en fin de Journée.[/li]

Les points 1 et 3 sont déjà réglés... Le point 2 me pose un problème. En effet, ma base Access doit se mettre à jour une fois par jour depuis l'AS400 (point 1) et le Soir l'AS400 est remis à jour avec l'export (point 3), donc le lendemain les infos sont 'fraiches'... Par contre pendant la journée active, il faut que je garde un suivi de traitement. Donc écrire dans Access...

Actuellement mon point 2, dans Access j'ai une clef unique qui me permet de remonter un enregistrement avec ma requête SQL SELECT sur RecordSet, dans mon UserForm sur une Interface de traitement sous Excel. (No Problèmo)

Il serait impeccable, qu'une fois cet enregistrement traité dans mon UserForm, un 'tag' vienne s'inscrire dans un des champs dispos de cette table pour cet enregistrement en clef unique (Afin d'éviter un doublon de traitement ultérieur par mon UserForm)

Je n'ai pas encore trouvé comme faire simple...(et rapide, la table Access contient des millers d'enregistrements)

Pour l'instant, une idée palliative serait de générer dans ma base Access une seconde Table temporaire en y ajoutant chaque enregistrement traîté, puis de faire une comparaison entre la Table Primaire et cette Table Temporaire afin de ne pouvoir sélectionner que les enregistrements non existants, mais je trouve ceci très très lourd. Le Tag serait vraiment plus rationnel.

Si jamais quelqu'un a un lien la-dessus je suis preneur... En fait ce serait un 'MODIFY' suite à une Query SELECT de recherche sur la Clef Unique... Rien trouvé encore la dessus, et j'ai tout l'interfaçage à livrer demain enfin hier lol !!! (comme d'hab)

Merci pour m'avoir lu jusque là, et bon dimanche à tous et toutes.

@+Thierry
 

Brigitte

XLDnaute Barbatruc
Coucou Thierry,


Bon moi pas la peine que je lise jusqu'au bout, j'ai compris dès les premières lignes que je comprendrais rien comme d'hab. Ca a l'air savant tout ca.

Mais j'en profite pour te faire un gros poutou... caniculaire !

Veinard, va te baigner pour nous tous.
 

MichelXld

XLDnaute Barbatruc
bonjour @+Thierry , bonjour Brigitte

je vais peut etre dire une betise mais si tu as des champs de disponibles dans la table , tu pourrais ajouter une information à l'enregistrement cible .
et ensuite verifier ce que contient ce champ losque tu lances une requete


pour modifier le champ d'un enregistrement :

Code:
Sub test()
Dim Conn As ADODB.Connection
Dim rsT As ADODB.Recordset
Dim fld As ADODB.Field

Set Conn = New ADODB.Connection
With Conn
' Définition du fournisseur OleDB pour la connexion
.Provider = 'Microsoft.JET.OLEDB.4.0'
' Ouverture d'une connexion
.Open ThisWorkbook.Path & '\\MaBase_V01.mdb'
End With

Set rsT = New ADODB.Recordset
'table nommée 'maTable'
rsT.Open 'maTable', Conn, adOpenKeyset, adLockOptimistic

With rsT
.MoveFirst
'recherche la valeur de la cellule A1 dans champ 'matricule'
.Find ('Matricule=' & Cells(1, 1))

'si valeur trouvée on modifie le champ 'leChamp'
.Fields('leChamp') = 'trouvé'
.Update
End With

Conn.Close
End Sub


bonne journée
MichelXld

Message édité par: MichelXld, à: 26/06/2005 12:47
 

michel_m

XLDnaute Accro
salut Thierry, Brigitte

Si j'ai bien compris ta demande:

Tu voudrais que lorsque tu as fait une écriture sur l'identifiant X existant de ta table tu ne puisses plus accèder à cet identifiant ?

Excuses moi, mais le mot 'tag' me dérange because anglais défaillant

L'dée de départ serait une colonne supplémentaire de type booléen
mais faudrait voir le pb de réinitialisation

Je ne te garantis rien pour cet aprèm question disponibilité

Michel
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour les Michels ! Bonjour Brigitte

Merci Brigitte de ta Solicitude !!! Si j'ai le temps ce soir, je pique une tête dans la grande bleue avec une pensée pour toi !!

Bon alors oui oui oui MichelXLD et Michel_M, c'est bien ça l'idée. Je parle de 'Tag' c'est comme les 'Tags' sur les murs, une marque de reconnaissance. Une Boolean pourrait être très bien, ou un simple 'X'... Si ce champs est vide c'est que l'enregistrement n'est pas traîté, si il y a 'x' ou 'True' c'est qu'on doit l'ignorer.

Ce qui me manquait dans mon vocabulaire c'est le moyen d'écrire sur un Champs précis disponible, sans modifier le reste de l'enregistrement ni la structure de ma Table Access.

Je m'en vais essayer le code... Je vous tiens au courant.

Merci à vous deux et à Brigitte pour le poutou !!!

@+Thierry
 

michel_m

XLDnaute Accro
Re

Petite idée avant que t'ailles piquer une t^te dans la mer:
Le champ pourrait être la date du jour ce qui évitererait des réinitialisations quotidiennes
pour ma part dans le prog, je convertirais la date en entier long car les formats dates sont délicats à manier

Michel
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re bonjour,

Je viens de tester, ça fonctionne, et je pense que je vais pouvoir pas mal avancer cet aprèm garce à ce 'Find' que je ne connaissais pas en tant que tel dans une requête via ADO.RecordSet.

Pour ceux qui voudraient l'utiliser plus en avant voici un peu de documentation de MicroSoft :

Guide de référence de l'API ADO 2.5 RecordSet 'Find'

Syntaxe
Find (Criteria, SkipRows, SearchDirection, Start)

Paramètres
Criteria
Valeur de type String contenant une instruction qui spécifie le nom de la colonne, l'opérateur de comparaison et la valeur à utiliser dans la recherche.
SkipRows
Facultatif. Valeur de type Long dont la valeur par défaut est zéro et qui spécifie le point de départ de la recherche sous la forme d'un décalage en lignes par rapport à la ligne actuelle ou d'un signet Start. Par défaut, la recherche commence sur la ligne actuelle.
SearchDirection
Facultatif. Valeur SearchDirectionEnum qui spécifie si la recherche doit commencer sur la ligne actuelle ou sur la ligne disponible suivante dans le sens de la recherche. Si ce paramètre a pour valeur adSearchForward, une recherche qui n'aboutit pas s'arrête à la fin de l'objet Recordset. Si ce paramètre a pour valeur adSearchBackward, une recherche qui n'aboutit pas s'arrête au début de l'objet Recordset.
Start
Facultatif. Signet de type Variant qui indique le point de départ de la recherche.

La méthode Find recherche dans un objet Recordset la ligne qui remplit le critère spécifié. Vous pouvez éventuellement préciser le sens de la recherche, la ligne de départ ou un décalage par rapport à la ligne de départ. Si le critère est rempli, la position de la ligne en cours devient l'enregistrement trouvé ; dans le cas contraire, la ligne en cours est positionnée à la fin (ou au début) de l'objet Recordset, suivant le sens de la recherche.

Le critère ne peut mentionner qu'un seul nom de colonne. En d'autres termes, cette méthode ne prend pas en charge les recherches dans plusieurs colonnes.

L'opérateur de comparaison du critère peut être « > » (supérieur à), « < » (inférieur à), « = » (égal à), « >= » (supérieur ou égal à), « <= » (inférieur ou égal à), « <> » (différent de) ou « LIKE » (condition).

La valeur spécifiée dans le critère peut être une chaîne, un nombre en virgule flottante ou une date. Les valeurs de type chaîne sont délimitées par des guillemets simples ou le symbole « # » (dièse), par exemple : « state = 'WA' » ou « state = #WA# ». Les dates sont délimitées par le symbole « # », par exemple : « start_date > #22/7/97# ».

Si l'opérateur de comparaison est « like », la chaîne indiquant la valeur de comparaison peut contenir un astérisque (*) pour rechercher une ou plusieurs occurrences d'un caractère ou d'une sous-chaîne. Par exemple, le critère « state like 'M*' » est rempli par les États du Maine et du Massachusetts. Vous pouvez également utiliser des astérisques en début et en fin de chaîne pour rechercher des valeurs qui contiennent une sous-chaîne. Par exemple, le critère « state like '*as*' » est rempli par les états de l'Alaska, de l'Arkansas et du Massachusetts.

Vous pouvez placer un astérisque à la fin seulement ou au début et à la fin d'une chaîne de critère, comme dans les exemples précédents. Vous ne pouvez pas placer un seul astérisque au début ('*str') ou à l'intérieur ('s*r') de la chaîne. Cela provoquerait une erreur.

Remarque Une erreur se produit si la position de la ligne actuelle n'est pas définie avant l'appel de la méthode Find. Vous devez appeler une méthode qui définit une position de ligne, par exemple MoveFirst, avant d'appeler la méthode Find.

Remarque Si vous appelez la méthode Find sur un jeu d'enregistrements, et si la position actuelle dans le jeu d'enregistrements correspond au dernier enregistrement ou à la fin du fichier (EOF), vous ne trouverez rien. Vous devez appeler la méthode MoveFirst pour définir la position actuelle ou le curseur actif au début du jeu d'enregistrements.


Voilà ça provient de l'aide Access 2003, si celà peut vous servir, (à moi oui, et vous m'avez fait gagner un temps précieux)

Merci Encore
@+Thierry
 

Discussions similaires