2016-01-22 64 views
0

使用VBScript,我通過SQL查詢和ADO連接對象創建記錄集。我需要能夠字段名和最大的字段長度寫入一個文本文件,基本爲一個二維數組中,字段名的格式| FieldLength參數以一個回車符,例如:VBScript記錄集字段名稱和長度

物數| X (13)
說明| X(92)
截止日期| X(10)

雖然我可以遍歷列和寫出來的字段名,我解決不了字段長度的問題。代碼如下:

Set objColNames = CreateObject("Scripting.FileSystemObject").OpenTextFile(LF14,2,true) 
For i=0 To LF06 -1 
    objColNames.Write(Recordset.Fields(i).Name & "|x(" & Recordset.Fields(i).ActualSize & ")" & vbCrLf) 
Next 

在這種情況下,只將當前所選字段長度。

+0

請定義「當前選擇的字段長度」。 –

+0

@ Ekkehard.Horner記錄集包含大約100行,我認爲它返回第一行或最後一行的ActualSize屬性。 –

回答

0

昏暗連接 昏暗的記錄

:多一點研究和測試後,我通過創建一個基於字典的記錄字段(列)數,然後通過每個項目迭代和評估每個字段的長度解決的問題
Set Connection = CreateObject("ADODB.Connection") 
Set Recordset = CreateObject("ADODB.Recordset") 

Connection.Open LF08 
Recordset.Open LF05,Connection 

LF06=Recordset.Fields.Count 

Set d = CreateObject("Scripting.Dictionary") 
Set objColNames = CreateObject("Scripting.FileSystemObject").OpenTextFile(LF14,2,true) 
For i=0 to LF06 -1 
    d.Add i, 0 
Next 

Dim aTable1Values 
aTable1Values=Recordset.GetRows() 

Set objFileToWrite = CreateObject("Scripting.FileSystemObject").OpenTextFile(LF07,2,true) 

Dim iRowLoop, iColLoop 
For iRowLoop = 0 to UBound(aTable1Values, 2) 
    For iColLoop = 0 to UBound(aTable1Values, 1) 
    If d.item(iColLoop) < Len(aTable1Values(iColLoop, iRowLoop)) Then 
     d.item(iColLoop) = Len(aTable1Values(iColLoop, iRowLoop)) 
    End If 

    If IsNull(aTable1Values(iColLoop, iRowLoop)) Then 
     objFileToWrite.Write("") 
    Else 
     objFileToWrite.Write(aTable1Values(iColLoop, iRowLoop)) 
    End If 
    If iColLoop <> UBound(aTable1Values, 1) Then 
     objFileToWrite.Write("|") 
    End If 
    next 'iColLoop 
    objFileToWrite.Write(vbCrLf) 
Next 'iRowLoop 

For i=0 to LF06 -1 
    d.item(i) = d.item(i) + 3 
    objColNames.Write(Recordset.Fields(i).Name & "|x(" & d.item(i) & ")" & vbCrLf) 
Next 

然後我有兩個文本文件,一個帶有字段名稱和長度,另一個帶有查詢結果。使用這個,我可以從結果中在CMS(VisualFiles)中創建一個二維數組。

0

如果我理解正確的問題(我不能肯定我做的)....

如果你改變你的SQL語句,你只需要返回一個記錄。

Select Max(Len([Matter Number])) as [Matter Number], 
    Max(Len([Description])) As Description, Max(Len([Due Date])) As [Due Date] FROM TableName 

這將返回每個字段的最大長度。然後從那裏構建你的輸出。

+0

雖然這個方法是動態的,但這個方法是動態的,所以列的數量可能會有所不同,而我可以將列名提取到數組中,但表名將是未知的,更不用說查詢中受到的條件子句。評估傳遞到方法中的sql,我不確定我將如何實現這一點。 –

0

爲了得到一個極值項目(最大,最小,...)的集合,你需要在所有元素的循環,對已知的「極值到目前爲止」檢查當前元素的值:

>> a = Array(1, 3, 2) 
>> x = a(0) 
>> For i = 1 To UBound(a) 
>>  If a(i) > x Then 
>>  x = a(i) 
>>  End If 
>> Next 
>> WScript.Echo x 
>> 
3 
+0

這與我所預期的那種解決方案相吻合,但我不確定您提供的解決方案是否提供了足夠的清晰度。你能詳細說明使用提供的語法參考嗎? –

+0

特別是當你'預期'在我的示例代碼中演示的原則時,你肯定可以將它適應於記錄集上的外部循環,極值數組(每列一個元素)以及If循環中的當前)字段。 –

+0

雖然我很欣賞你提供的示例代碼的迴應,但我並不完全理解提供的引用是如何直接與記錄集中的字段相關的。這就是爲什麼我要求你嘗試相關的語法示例。 –