[VB6] Maken van dBase III/IV

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

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Topicstarter
De feiten
• Programma's die wij moeten gebruiken kunnen alleen overweg met dBase III/IV.

• De dBase bestanden hebben allemaal een andere lay-out, met betrekking tot velden, en veld-lengte's.

• De data is altijd afkomstig uit 1 en de zelfde Access tabel. Deze gegevens zijn gevuld met wat de klant aanleverd kwa informatie.

Het struikelblok
• Wij importeren de gegevens van de klant in een Access-tabel met een applicatie die wij in VB6 hebben geschreven. We weten dus met converteren welke velden gevuld zijn, en wat de lengtes zijn.

• Door gebruik te moeten maken van oude software, moeten we dus exporteren naar dBase III/IV. Simpelweg in Access een tabel exporteren is no-go: Access tabel heeft 80 velden, met lengte's van 255, en hier kan de software niet mee overweg.

De vraag
• Hoe kan ik met VB6 een dBase III/IV bouwen? We weten welke velden we moeten maken, de lengte die de velden moeten hebben. Enige wat we hebben gevonden was het invoegen van records in een bestaande dBase d.m.v SQL Statements. En dat is niet wat wij willen. Is het uberhaut wel mogenlijk met VB6 om een dBase III/IV te maken vanuit het niets?

Ey!! Macarena \o/


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:24

Creepy

Tactical Espionage Splatterer

My l33t google skills:
http://www.google.com/sea...&q=VB6+create+dbase+table

En klik op de eerste Link. Een mooie functie om een Dbase tabel aan te maken in VB6.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Topicstarter
Creepy:
Thanx, het enige wat dus in mijn search-string miste was het woord table. Aangezien ik niet beter weet dat een dBase een database is, en Access ook, maar die heeft tabellen, en een dBase III/IV niet.
Als ik het zo zie, kunnen we hier aardig mee uit de voeten.

Ey!! Macarena \o/


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:24

Creepy

Tactical Espionage Splatterer

DBase is wat dat betreft een beetje vreemd :)
Een DBase database is een directory. De .dbf files hierin zijn de tabellen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 12:56

glashio

C64 > AMIGA > PC

Creepy schreef op 09 augustus 2004 @ 11:46:
Een DBase database is een directory. De .dbf files hierin zijn de tabellen.
Aha dan is MySQL ook vreemd :)
* glashio denkt aan CHEM z'n signature O-)

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


  • PipoDeClown
  • Registratie: September 2000
  • Niet online

PipoDeClown

Izze Zimpell

http://www.wotsit.org/search.asp?s=database

helaas is mijn eigen leet tp7 unit dbm pleite ^_^

God weet alles, want hij is lid van de Mosad. To protect your freedom i will take that away from you. Mijn drankgebruik heeft ernstig te lijden onder mijn gezondheid.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:24

Creepy

Tactical Espionage Splatterer

glashio schreef op 09 augustus 2004 @ 11:49:
[...]
Aha dan is MySQL ook vreemd :)
* glashio denkt aan CHEM z'n signature O-)
Valt mee (alhoewel :+ ).

Het verschil met MySQL is dat er centraal wordt bijgehouden welke databases er zijn. Dat is bij DBAse niet het geval.

Elke directory is een potentiele DBase database. MySQL echter slaat alle tabellen op in 1 bepaalde directory en houdt daarnaast ook bij welke databases er uberhaupt zijn.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Topicstarter
Nou, die links hebben we niets aan dus.

Zijn stukken source welk betrekking hebben tot producten die je moet aanschaffen en dan in VB kunt gebruiken.

Wij willen gewoon weg puur met Visual Basic 6 een DBF kunnen aanmaken.

Maar we gaan weer verder zoeken. |:(

Ey!! Macarena \o/


Verwijderd

Via ADO en de goede connection string voor dBase files moet er wel uit te komen zijn.
Kijk eens of dit helpt:
http://www.planetsourceco...?txtCodeId=49465&lngWId=1

Verwijderd

Als TS wilt, kan ik wel wat pascal sources sturen (als ik ze nog kan vinden) om dBase bestanden te lezen/schrijven ( alleen data, geen index).

Zou niet zo moeilijk moeten zijn om dit om te schrijven naar VB, echter ik denk dat met wat zoeken je genoeg native VB code vind voor dit doel.

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Topicstarter
Na dat ik wist dat dBase III/IV dus eigenlijk een Table is, heb ik wat zoekopdrachten kunnen verfijnen.

DAO 3.51 Enablen in project properties, en....
code:
1
2
3
4
5
6
7
8
9
Dim db As DAO.Database
Dim strSQL As String

Set dbvtt = DBEngine.Workspaces(0).OpenDatabase("C:\files\", 0, 0, "dBase III;")
dbvtt.Execute ("Create table VehTrans (VehID LONG, vehIP string(20));")
dbvtt.Execute ("CREATE UNIQUE INDEX VehIDInd ON VehTrans (VehID);")
dbvtt.Execute ("CREATE UNIQUE INDEX VehIPInd ON VehTrans (VehIP);")

dbvtt.Execute ("INSERT INTO VehTrans VALUES(12,'test1');")


Hiermee wordt met VB dus netjes een DBF gemaakt.

[ Voor 94% gewijzigd door RaZ op 09-08-2004 16:07 ]

Ey!! Macarena \o/


Verwijderd

En als je liever ADO code wilt hebben i.p.v. DAO


Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
  Dim cn As ADODB.Connection
  Dim rs As ADODB.Recordset
  Set cn = New ADODB.Connection
  Set rs = New ADODB.Recordset

  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\;" & _
          "Extended Properties=""dbase III;"";Persist Security Info=False"

  rs.Open "Select * from ONDERPND", cn
  cn.Execute "Insert into ONDERPND ( onderpand ) values ('test')"


waarbij je dan de C:\ vervangt natuurlijk

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 12:56

glashio

C64 > AMIGA > PC

Verwijderd schreef op 09 augustus 2004 @ 16:59:
En als je liever ADO code wilt hebben i.p.v. DAO
Ik heb begrepen dat je bij het aanmaken weer beter ADOX kan gebruiken.
Hier een .dbf voorbeeld.

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Topicstarter
We zijn momenteel nu bezig met de code die ik heb gevonden. Het maakt in princiepe niet echt uit welke routine er wordt gebruikt, als hij maar werkt ;)

Of jullie moeten me overtuigen ipv DAO, ADO of ADOX te gebruiken >:)

Ey!! Macarena \o/


  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Topicstarter
We hebben het draaidende, alleen zit nog nog met een probleem:
code:
1
dbvtt.Execute ("INSERT INTO VehTrans VALUES(12,'test1');")


als het veld een tekst veld is, moet het tussen ' ' staan. Nu komt het ook wel eens voor dat we gegevens hebben zoals:
• In't Veldt <- Achternaam
• s'Gravenhade <- Plaats

Hierbij gaat de hele handel op z'n gat, omdat het commando denk dat we het tekstveld afsluiten.
Hier hebben we een replace() staan:
code:
1
Replace(veld,"'","`")

Maar dit is natuurlijk niet wat een klant aanleverd.

Wat we nu doen is: We bouwen 1 variale op, met de gegevens die we willen invoegen, en die gooien we keihard zo de DBF in. Nadat we dus ' hebben vervangen.

Wat we willen voorkomen is, dat we klanten krijgen, die vragen stellen waarom we ipv. s'Gravenhage s`Gravenhage printen...

We vullen de DBF niet op veld-niveau, maar op record niveau.

Het is eigenlijk voor ons onaceptabel om dit teken te moeten vervangen.

NB: We gebruiken dus de routine die ik hierboven al heb vermeld.

Ey!! Macarena \o/


Verwijderd

RaZ schreef op 10 augustus 2004 @ 21:36:
. . .
Wat we willen voorkomen is, dat we klanten krijgen, die vragen stellen waarom we ipv. s'Gravenhage s`Gravenhage printen...

We vullen de DBF niet op veld-niveau, maar op record niveau.

Het is eigenlijk voor ons onaceptabel om dit teken te moeten vervangen.

NB: We gebruiken dus de routine die ik hierboven al heb vermeld.
Quotes zijn altijd $^#$@@!#. Maar meestal kun je ze invoegen door ze te verdubbelen

code:
1
INSERT INTO VehTrans VALUES(12,'''s Gravenhage')

dus tijdens het opbouwen van je INSERT-statement moet je alle enkele quote vervangen door 2 enkele ( replace (veldwaarde,"'","''") ), en daarna pas je enkele quotes eromheen zetten.

Verwijderd

Dit moet ook wel werken:
code:
1
("INSERT INTO testdb VALUES(12," & Chr(34) & "s'Gravenhage" & Chr(34) & ");")

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Topicstarter
ff een klein schopje omhoog.

Ik krijg de vraag, of het mogenlijk is, om eventueel 10 records te inserten met elk veld kompleet gevuld. Deze dienen dan als inloop records.

Dit is niet altijd nodig, dus 70% van de gemaakte dbase'jes zijn dus zonder de 10 records.

Alleen, als de dbase is gemaakt, zeg een duizendje of 10, die instel-records moeten wel op record 1 t/m 10 komen. M.a.w. hij moet ze dus echt INSERTEN op record 1.

Ik heb totaal geen results gehad met zoek op vb sql instert into "at" aangezien at niet een zoekterm is voor google :(

Is het uberhaut wel mogenlijk om in een bestaande dbase 3 10 records intevogen vanaf record 1?

Ey!! Macarena \o/


  • Paul
  • Registratie: September 2000
  • Nu online
DBase tabellen zijn in wezen gewoon platte textbestanden met vaste veldlengte. In Delphi is een TTable.Insert gelijk aan een TTable.Append bij DBase velden, dus ik denk niet dat het lukt.

Wat je kunt doen is de eerste 10 records kopieren naar het einde van het bestand en dan de oude records weer overschrijven?

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Als je wil toevoegen aan het begin van je tabel, dan kun je dat toch ook met een sortering bewerkstelligen? Het lijkt me niet dat er geen andere oplossing gevonden kan worden om de records 'normaal' aan je tabel toe te voegen om vervolgens in je weergave te zorgen voor een correcte sortering.

My personal website

Pagina: 1