Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

VBA में SQL क्वेरी आउटपुट SQL Oracle से भिन्न है

समस्या है CopyFromRecordset - यह 255 वर्णों में छोटा हो रहा है, और यह एकमात्र एक्सेल नहीं है। रेंज विधि जो ऐसा करती है।

सवाल यह है:क्या मेरे पास कोई तरीका है जो नहीं करता है? और क्या आपके पास एक OLEDB ड्राइवर है जो इसे आपके रिकॉर्डसेट पर कर रहा है, इससे पहले कि आप सीमा तक लिखने के चरण तक पहुंचें?

आपको VBA में अपने रिकॉर्डसेट के माध्यम से लूप करना चाहिए, और आपत्तिजनक फ़ील्ड VBA में . की जांच करनी चाहिए लंबाई में 255 वर्णों से अधिक मान के लिए। यदि फ़ील्ड पहले ही काट दी गई हैं, तो Microsoft Oracle OLEDB प्रदाता के बजाय अपने कनेक्शन स्ट्रिंग में मूल Oracle क्लाइंट ड्राइवरों का उपयोग करने का प्रयास करें - Connections.com के पास जानकारी होगी।

एक बार जब आप जान जाते हैं कि रिकॉर्डसेट में वास्तव में आपका डेटा है, तो बिना कांट-छांट के, CopyFromRecordset को फिर से आज़माएं। मैं वास्तव में यह उम्मीद नहीं करता कि यह लंबाई में 255 वर्णों से अधिक का क्षेत्र लिखे, लेकिन मुझे त्रुटि का सामना करते हुए कुछ समय हो गया है, इसे ठीक किया जा सकता है, और निराशावादी को सुखद आश्चर्य देना हमेशा अच्छा होता है।

अगला:

CopyFromRecordset के लिए एक VBA विकल्प

यहाँ तीन कार्य हैं:

  1. Recordset.GetRows() का उपयोग करके डेटा के साथ VBA सरणी संस्करण को पॉप्युलेट करें;
  2. सरणी को स्थानांतरित करें, क्योंकि GetRows एक्सेल के लिए गलत तरीका है;
  3. एक लक्ष्य श्रेणी को आकार दें और सरणी को Range.Value = Array के रूप में लिखें , एक दोहराव वाला कार्य जिसे ArrayToRange() रूटीन में स्वचालित किया जाना चाहिए।

...और शायद कुछ सहायक क्षेत्र के नाम लिखने के साथ काम करते हैं, लेकिन मैं इसे एक संक्षिप्त उत्तर में अनदेखा कर रहा हूं।

अंतिम परिणाम यह है कि आप इस कोड को चलाते हैं:


    ArrayToRange rngTarget, ArrayTranspose(rst.GetRows)

सरणी को स्थानांतरित करना तुच्छ है, लेकिन यहाँ यह वैसे भी है:


Public Function ArrayTranspose(InputArray As Variant) As Variant
Application.Volatile False
Dim arrOutput As Variant
Dim i As Long Dim j As Long Dim iMin As Long Dim iMax As Long Dim jMin As Long Dim jMax As Long
iMin = LBound(InputArray, 1) iMax = UBound(InputArray, 1) jMin = LBound(InputArray, 2) jMax = UBound(InputArray, 2)
ReDim arrOutput(jMin To jMax, iMin To iMax)
For i = iMin To iMax For j = jMin To jMax arrOutput(j, i) = InputArray(i, j) Next j Next i
ArrayTranspose = arrOutput
End Function
... और ArrayToRange तुच्छ है यदि आप सरणी आयामों के लिए चेक नहीं जोड़ते हैं और लक्ष्य कोशिकाओं में सूत्रों को संरक्षित करते हैं:आवश्यक बिंदु यह है कि आप अपना डेटा एक 'हिट' में लिख सकते हैं यदि सीमा के आयाम बिल्कुल मेल खाते हैं सरणी के आयाम:

Public Sub ArrayToRange(rngTarget As Excel.Range, InputArray As Variant)
' Write an array to an Excel range in a single 'hit' to the sheet
' InputArray should be a 2-Dimensional structure of the form Variant(Rows, Columns)
' The target range is resized automatically to the dimensions of the array, with ' the top left cell used as the start point.
' This subroutine saves repetitive coding for a common VBA and Excel task.
' Author: Nigel Heffernan http://Excellerando.blogspot.com

On Error Resume Next
Dim rngOutput As Excel.Range
Dim iRowCount As Long Dim iColCount As Long
iRowCount = UBound(InputArray, 1) - LBound(InputArray, 1) iColCount = UBound(InputArray, 2) - LBound(InputArray, 2)
With rngTarget.Worksheet
Set rngOutput = .Range(rngTarget.Cells(1, 1), _ rngTarget.Cells(iRowCount + 1, iColCount + 1))
Application.EnableEvents = False

rngOutput.Value2 = InputArray
Application.EnableEvents = True
Set rngTarget = rngOutput ' resizes the range This is useful, most of the time
End With ' rngTarget.Worksheet
End Sub
के साथ खत्म करें

सावधानी का एक नोट:एक्सेल के पुराने संस्करणों में (ऑफिस 2000, अगर मुझे याद है) सरणी 'लिखना' अभी भी 255 वर्णों तक छोटा हो गया है। यह अब कोई समस्या नहीं है; और यदि आप अभी भी XL2000 का उपयोग कर रहे हैं, तो 255 वर्णों से अधिक की स्ट्रिंग वाले कक्ष एक समस्या के लिए पर्याप्त हैं, जिसे आप काट-छाँट से खुश हो सकते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlAlchemy और cx_Oracle का उपयोग करके Oracle डेटाबेस में पांडा डेटाफ़्रेम लिखते समय to_sql () को गति दें

  2. एक ट्रिगर बनाना

  3. ORA-00907:विदेशी कुंजी Oracle 12c बनाने पर राइट कोष्ठक गुम होना

  4. Oracle ट्रिगर इंसर्ट/अपडेट

  5. त्रुटि ORA-00937 क्यों हो रही है