[acces - vba] gegevenstype niet gedefinieerd

Pagina: 1
Acties:
  • 1.167 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • TeasingU
  • Registratie: Juni 2001
  • Laatst online: 15-09-2022

TeasingU

I Live Longer

Topicstarter
Hoi allemaal,

Op dit moment ben ik bezig met een project dat helemaal over MS Access gaat. De database die we nu hebben is aardig groot, zo'n 40 tabellen.

Om de tabellen uiteindelijk automatisch aan te kunnen maken gebruik ik een script in vba, om de create tables automatisch aan te maken.

Op een andere dbase werkt het script zonder enkele problemen, maar op de database die ik nu gebruik krijg ik een foutmelding te zien:

"Compileerfout: Een door de gebruiker gedefinieerd gegevenstype is niet gedefinieerd"

Hier is het script:
###########################

Sub exportSQL()
Dim db As Database
Set db = CurrentDb()

Open "c:\definitiequeries.txt" For Output As #1
Open "c:\validatieregels.txt" For Output As #2

Dim fieldList As String, fieldList2 As String

' loop through tables
Dim tableIndex As Integer
For tableIndex = 0 To db.TableDefs.Count - 1

Dim table As TableDef
Set table = db.TableDefs(tableIndex)

' only visible tables
If (((table.Attributes And DB_SYSTEMOBJECT) Or _
(table.Attributes And DB_HIDDENOBJECT))) = 0 Then

Print #1,: Print #1, "CREATE TABLE " & table.Name & " ("

Dim tableValidations As Boolean

If table.validationRule <> "" Then
Print #2,: Print #2, "Table " & table.Name & ": " & table.validationRule
tableValidations = True
Else
tableValidations = False
End If

fieldList = ""

' list datatypes
Dim fieldIndex As Integer
For fieldIndex = 0 To table.Fields.Count - 1
Dim field As field
Set field = table.Fields(fieldIndex)

' if this is not the first iteration, add separators
If fieldList <> "" Then
fieldList = fieldList & ", "
Print #1, ","
End If

fieldList = fieldList & field.Name

Dim typestr As String

If ((field.Attributes And dbAutoIncrField) <> 0) Then
typestr = "AUTOINCREMENT NOT NULL"
Else
Select Case field.Type
Case dbBinary: typestr = "BINARY"
Case dbBoolean: typestr = "YESNO"
Case dbCurrency: typestr = "CURRENCY"
Case dbDate: typestr = "DATETIME"
Case dbDecimal: typestr = "DECIMAL(20,4)"
Case dbFloat: typestr = "FLOAT"
Case dbSingle: typestr = "SINGLE"
Case dbDouble: typestr = "DOUBLE"
Case dbNumeric: typestr = "NUMERIC"
Case dbByte: typestr = "BYTE"
Case dbInteger: typestr = "INTEGER"
Case dbLong: typestr = "LONG"
Case dbMemo: typestr = "MEMO"
Case dbGUID: typestr = "GUID"
Case dbText:
If field.Size = 0 Then field.Size = 255
typestr = "CHAR(" & field.Size & ")"
Case Else
MsgBox "Table " & table.Name & " field " & field.Name & ": unrecognized type identifier"
End Select
If field.Required = True Then typestr = typestr & " NOT NULL"
End If

Print #1, Space$(INDENT_SIZE) & field.Name & " " & typestr;
Next fieldIndex

' list primary keys
Dim index As index
For Each index In table.Indexes
If index.Primary Then
fieldList = ""
Dim f As field
For Each f In index.Fields
If fieldList <> "" Then fieldList = fieldList & ", "
fieldList = fieldList & f.Name
Next f
Print #1, ",": Print #1, Space$(INDENT_SIZE) & "PRIMARY KEY (" & fieldList & ")";
End If
Next index

' list foreign keys
Dim r As Relation
For Each r In db.Relations
If r.ForeignTable = table.Name Then
Dim f3 As field
fieldList = ""
fieldList2 = ""
For Each f3 In r.Fields
If fieldList <> "" Then fieldList = fieldList & ", "
fieldList = fieldList & f3.Name
If fieldList2 <> "" Then fieldList2 = fieldList2 & ", "
fieldList2 = fieldList2 & f3.ForeignName
Next f3
Print #1, ",": Print #1, Space$(INDENT_SIZE) & "FOREIGN KEY (" & fieldList2 & ") REFERENCES " & r.table & "(" & fieldList & ")";
End If
Next r

' end query
Print #1,: Print #1, Space$(INDENT_SIZE) & ");"

' list field validation rules
For fieldIndex = 0 To table.Fields.Count - 1
Set field = table.Fields(fieldIndex)
If field.validationRule <> "" Then
If Not tableValidations Then
Print #2,: Print #2, "Table " & table.Name
tableValidations = True
End If
Print #2, field.Name & ": " & field.validationRule
End If
Next

End If
Next tableIndex

Close #1
Close #2
db.Close

End Sub
###########################

Na lang kijken kom ik tot de conclusie dat alle gegevenstypen die in deze dbase staan, ook allemaal gebruikt worden in die vorige database.

De help van access heeft het voornamelijk over een fout gegevenstype maar dat sluit ik als fout al uit.

Het runnen van het script hierboven heb ik op beide dbases gedaan, op mijn pc met dezelfde access 2000 versie.
Beide dbases zijn gemaakt in een nederlandse versie van access.

De regel: "Case dbText:"
Heb ik al een keer aangepast naar:
"Case dbTekst:"
of
"Case dbText: typestr = "TEXT"
of
"Case dbTekstt: typestr = "TEKST"

Maar dat heeft geen effect.

Heeft iemand een idee waar het fout zit? Of heeft iemand tips? Zoja, dan hoor ik dat graag :)

cd /usr/ports/www/porn make install


Acties:
  • 0 Henk 'm!

Verwijderd

wel, hoe zouden we enig idee hebben waar de fout zit als je niet aangeeft op welke regel die melding optreedt. Of is dat in de Case db text: regel, als ik je post doorlees kom ik er niet uit of je dat bedoelt, of dat de fout ook nog ergens anders kan zitten...

Verdere opmerkingen: die regel heeft weinig zin als je geen regelnrs gebruikt (tip 1), en de lap code is sowieso zo groot dat niemand die zal doorspitten (tip 2) :)

Acties:
  • 0 Henk 'm!

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 10-09 12:12
Visual Basic:
1
Dim Db as dao.database


Dat zou het moeten verhelpen denk ik.

Acties:
  • 0 Henk 'm!

  • ATS
  • Registratie: September 2001
  • Laatst online: 10-09 06:36

ATS

Weet je zeker dat die twee databases ook dezelfde references gebruiken naar externe libraries?

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 10-09 12:12
Ik denk dat hij een verwijzing heeft naar DAO en naar ADO. Standaard pakt hij dan ADO bij
Visual Basic:
1
Dim Db as Database


Of je vinkt ADO uit bij je reference of je declareerd hem als hierboven.

Acties:
  • 0 Henk 'm!

  • TeasingU
  • Registratie: Juni 2001
  • Laatst online: 15-09-2022

TeasingU

I Live Longer

Topicstarter
Hoi Sikko2go, je hebt helemaal gelijk. Ik zat zelf hier naar te kijken:

Case dbBinary: typestr = "BINARY"
Case dbBoolean: typestr = "YESNO"
Case dbCurrency: typestr = "CURRENCY"
Case dbDate: typestr = "DATETIME"
Case dbDecimal: typestr = "DECIMAL(20,4)"
Case dbFloat: typestr = "FLOAT"
Case dbSingle: typestr = "SINGLE"
Case dbDouble: typestr = "DOUBLE"
Case dbNumeric: typestr = "NUMERIC"
Case dbByte: typestr = "BYTE"
Case dbInteger: typestr = "INTEGER"
Case dbLong: typestr = "LONG"
Case dbMemo: typestr = "MEMO"
Case dbGUID: typestr = "GUID"
Case dbText:

De laatste regel wilde ik dus aanpassen maar dat hielp niet.

(nog ff een vraagje, hoe zet ik die code neer net zoals supervisor dat doet?)

Supervisor: Dim db as dao.database werkt helaas niet.

ATS, ik eerlijk geen idee waar je het over hebt, volgens mij wordt er niets gedaan met externe libraries maar ik kan het fout hebben.

cd /usr/ports/www/porn make install


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 12:01
Supervisor schreef op 08 October 2003 @ 12:20:
Ik denk dat hij een verwijzing heeft naar DAO en naar ADO. Standaard pakt hij dan ADO bij
Visual Basic:
1
Dim Db as Database


Of je vinkt ADO uit bij je reference of je declareerd hem als hierboven.
Afhankelijk van de volgorde waarin je je references hebt staan

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1