2016-12-05 2 views
0

Dans le code suivant, je peux obtenir le nombre d'Excel à l'aideconnexion VBScript Excel ADO: Obtenir la valeur en utilisant l'alias de colonne dans la requête SQL

objTempRecordset.Fields.Item(0).Value

Cependant, je veux utiliser l'alias de nom de colonne dans SQL. -à-dire

sSQL = "Select Count(*) AS RecCount FROM [NELimits$] A WHERE A.Type = 'A' AND A.ID = " &Chr(39) & "R001" & Chr(39) 

et je veux obtenir le résultat en utilisant:

objTempRecordset.Fields.Item("RecCount").Value

J'ai essayé aussi objTempRecordset.Fields.Item("_Count(*)_").Value mais pas de chance

Quelqu'un peut-il s'il vous plaît laissez-moi savoir comment utiliser l'alias de nom de colonne dans ce cas?

Note: Excel dispose de 2 colonnes ID: avec des valeurs telles que "R001", "R002" Type: avec des valeurs telles que "A", "B", "C"

Exemple de code:

sSQL = "Select Count(*) FROM [NELimits$] A WHERE A.Type = 'A' AND A.ID = " &Chr(39) & "R003" & Chr(39) 
Sqlquery = sSQL 
sFilePath = "C:\Temp\DataSheet.xlsx" 

Dim objTempConnection : Set objTempConnection = CreateObject("ADODB.Connection") 
Dim objTempRecordSet : Set objTempRecordSet = CreateObject("ADODB.Recordset") 

Dim strPath 
'Define constants for objTempRecordset 
Const adOpenStatic=3 
Const adLockOptimistic=3 
Const adLockPessimistic=2 
Const adCmdText = &H001 

'Open connection 
objTempConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="& sFilePath &";Extended Properties=""Excel 12.0 Xml;HDR=YES"";" 

objTempRecordset.ActiveConnection = objTempConnection 
objTempRecordset.CursorType = adOpenStatic 
objTempRecordset.LockType = adLockOptimistic 
objTempRecordset.Open Sqlquery 

If objTempRecordset.EOF Or objTempRecordset.BOF Then 
    msgbox "no record" 
End If 

msgbox "Record Count: "&objTempRecordset.RecordCount 

msgbox "Value:" & objTempRecordset.Fields.Item(0).Value 

+0

viens de remarquer que ** objTempRecordset.Fields.Item (0) .Nom ** retours ** Expr1000 ** et ** objTempRecordset.Fields.Item ("Expr1000"). Valeur ** retours valeur correcte Cependant, je ne suis pas sûr de ce que ** ** Expr1000 signifie et comment il est affecté. Je ne sais pas si cela changera pour différentes feuilles Excel, données, etc, donc besoin d'un moyen de définir l'alias pour les colonnes afin que je puisse récupérer des données basées sur l'alias – Yogesh

+0

Résolu: ... "SELECT column_name ** As [ alias_name] ** FROM ... "dans SQL a résolu le problème. Grâce à ce message: http://stackoverflow.com/questions/37466225/expr1000-error-who-performing-a-sum-on-a-sql-query-in-excel – Yogesh

+0

Etes-vous sûr de 'objTempRecordset.Fields .Item ("RecCount"). Value' n'a pas fonctionné comme il aurait dû si vous avez utilisé la première requête SQL (pas le second dans le bloc de code)? En premier lieu, vous avez affecté un alias de colonne * RecCount * mais pas en second ce que le moteur ACE SQL assigne en tant que générique * Expr1000 *. – Parfait

Répondre

1

avec le moteur SQL ACE (utilisé ici dans le classeur interrogation), les noms de champ d'origine, des alias de colonne, ou les noms de table avec des espaces, des caractères spéciaux (non alphanumériques) ou reserved words doivent être enveloppés dans crochet carré s ou les backticks pour leur échapper correctement.

espaces

sSQL = "Select Count(*) AS [Rec Count] FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 
sSQL = "Select Count(*) AS `Rec Count` FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

Caractères spéciaux (par exemple, trait d'union et livre/signe hashtag)

sSQL = "Select Count(*) AS [Rec-Count] FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 
sSQL = "Select Count(*) AS `Rec-Count` FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

sSQL = "Select Count(*) AS [Rec#] FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 
sSQL = "Select Count(*) AS `Rec#` FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

mots réservés (par exemple, Count)

sSQL = "Select Count(*) AS [Count] FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 
sSQL = "Select Count(*) AS `Count` FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

Sinon, un nom de domaine ou un alias de colonne est légitime dans la requête et peuvent être lus en jeu d'enregistrements dans les formats suivants:

objTempRecordset.Fields.Item(0).Value    ' BY INDEX IN ITEM ' 
objTempRecordset.Fields.Item("Rec Count").Value  ' BY NAME IN ITEM ' 
objTempRecordset.Fields("Rec Count").Value   ' BY NAME IN FIELD COLLECTION ' 
objTempRecordset![Rec Count].Value     ' BY NAME (EXCLAMATION POINT QUALIFIER) ' 

De plus, les alias de colonnes manquantes sont traitées d'une manière spéciale avec ACE:

Alias ​​manquant sur l'expression de requête (par exemple, L'agrégation de la fonction Count)

sSQL = "Select Count(*) FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

manquant Alias ​​Duplicate champs

sSQL = "Select ID, ID FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

Pour plus de deux alias manquants, le moteur ACE crée un alias de colonne généralement à partir Expr1 (intérieur MS Access - l'interface habituelle au moteur ACE) ou Expr1000 pour les connexions ODBC et l'incrémentation pour toutes les autres expressions non nommées ou les références de champ dupliquées sans nom.

+0

Génial! Merci beaucoup pour une réponse détaillée @Parfait – Yogesh

+0

Ah! Je ne le savais pas. terminé! – Yogesh