24 June 2008

MS Access: Утилита по выдаче данных запроса в консоль отладки

Microsoft AccessVisual Basic for Applications
Работая с Аксесом каждый день, я несколько раз на дню сталкиваюсь с проблемой, что мне где-нибудь в VBA-коде нужно посмотреть, что же вернет мне тот или иной SQL-запрос. Для этого мне приходится переключаться из VBA-редактора в основную часть программы, и либо создавать временный запрос (который потом волей-неволей сохраняется), либо быстренько менять SQL в каком-нибудь временном запросе. Поскольку на это тратится всегда куча времени, я решил написать простую функцию, которая выдает результаты запроса в консоль отладки.

Утилита это называется q (чтобы было удобно вызывать, и намек на Query — запрос), принимает она в качестве параметров сам запрос (либо полностью в виде SQL, либо только название запроса или таблицы, главное, чтобы это можно было открыть через CurrentDB.OpenRecordset), максимальную ширину поля при выдаче (если поле больше — оно обрезается, по умолчанию — 10 символов) и максимальное количество записей (по умолчанию — 100 записей), и выдает в консоль содержимое результатов данного запроса в текстовом виде, выглядит это вот так:

?q("qryStatBestVertriebler")
Running qryStatBestVertriebler...
Query returned 9 entries.
-------------------------------------------------------------------------------------
|  Nr |        VMB |      FName |    Einkauf |    Verkauf |     Gewinn |        Num | 
-------------------------------------------------------------------------------------
|    1|        757 | Sönke Doba |  492661,52 |   718774,8 |  226113,28 |        231 | 
|    2|        877 | Johannes W |   10464,99 |   59677,25 |   49212,26 |         39 | 
|    3|       1098 | Marco Müll |    8233,18 |   12244,77 |    4011,59 |         36 | 
|    4|       5527 | Torben Jas |   12974,64 |   24642,42 |   11667,78 |         16 | 
|    5|       6214 | Thiemo Wol |    5932,17 |   12175,97 |     6243,8 |         23 | 
|    6|       7833 | Florian Mi |  207384,93 |  293553,82 | 86168,8900 |        254 | 
|    7|       8310 | Daniel Sch |    3525,56 |    4338,92 |     813,36 |          4 | 
|    8|       8917 | Daniela He |  187881,29 |  638726,06 |  450844,77 |        559 | 
|    9|       9330 | Konrad Cyw |   94142,67 |  133056,71 |   38914,04 |        139 | 
-------------------------------------------------------------------------------------
Falsch


А вот ее код:
  1. Public Function q(Optional strSQL As String = "", Optional intWidth As Integer = 10, Optional intMax As Integer = 100) As Boolean
  2.  
  3.   Dim tmpRCDSet As Recordset, tmpFeld As Field, tmpString As String, I As Integer, intTemplen As Integer
  4.   Dim intNr As Integer
  5.   
  6.   On Error GoTo Err_SQL
  7.   Debug.Print «Running „ & strSQL & “...»
  8.   Set tmpRCDSet = CurrentDb.OpenRecordset(strSQL)
  9.     tmpRCDSet.MoveLast
  10.     Debug.Print «Query returned „ & tmpRCDSet.RecordCount & “ entries.»
  11.     tmpRCDSet.MoveFirst
  12.     tmpString = "| Nr | "
  13.     For Each tmpFeld In tmpRCDSet.Fields
  14.       tmpString = tmpString & padleft(tmpFeld.Name, intWidth) & " | "
  15.     Next
  16.     
  17.     Debug.Print String(Len(tmpString) — 1, "-")
  18.     Debug.Print tmpString
  19.     Debug.Print String(Len(tmpString) — 1, "-")
  20.     
  21.     intNr = 1
  22.     While (Not (tmpRCDSet.EOF)) And (intNr <= intMax)
  23.       tmpString = "| " & padleft(Str(intNr), 4) & "| "
  24.       For Each tmpFeld In tmpRCDSet.Fields
  25.         tmpString = tmpString & padleft(Nz(tmpFeld.Value, ""), intWidth) & " | "
  26.       Next
  27.       Debug.Print tmpString
  28.       intNr = intNr + 1
  29.       tmpRCDSet.MoveNext
  30.     Wend
  31.     Debug.Print String(Len(tmpString) — 1, "-")
  32.   
  33.   Exit Function
  34.  
  35.  
  36. Err_SQL:
  37.   Debug.Print Err.Number & " " & Err.Description
  38.   Debug.Print «Bad SQL string»
  39.  
  40.  
  41. End Function
  42.  
  43. Function padleft(strLineIn As String, intWidth As Integer) As String
  44.  
  45. If Len(strLineIn) = intWidth Then
  46.   padleft = strLineIn
  47. ElseIf Len(strLineIn) > intWidth Then
  48.   padleft = Mid(strLineIn, 1, intWidth)
  49. Else
  50.   padleft = String(intWidth — Len(strLineIn), " ") & strLineIn
  51. End If
  52.  
  53. End Function
* This source code was highlighted with Source Code Highlighter.
Tags:MS AccessMicrosoftVBAVisual BasicSQLDatabase
Hubs: Microsoft Access Visual Basic for Applications
+6
4.5k 7
Comments 2