Toon posts:

[DELPHI (& VB)] Currency conversie?!?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een omzet-programma. Het doel is een binair bestand, welke wordt gevuld vanuit VB, in Delphi te converteren naar een CSV-bestand.

Ik ben nu op een probleem gestuit waar ik niet uit kom. In het binaire bestand wordt namelijk oa. een (VB)Currency waarde opgeslagen en ik heb geen idee hoe ik dat moet converteren naar een correcte Delphi-waarde.

Ik heb een TFileStream-object gemaakt en lees mbv Read elke keer een char uit, dit gaat goed voor Strings en Integers maar Currency's geven dus 'junk' terug.

Wanneer ik met

ReadBuffer(eenCurrency,8)

probeer te lezen krijg ik wel een 'leesbare' waarde terug echter geen correcte!
(tenzij jullie je kunnen voorstellen dat een kogellager 4.6076327788e+14 euro's mag kosten)

Ik heb verder geen informatie over hoe de data in VB wordt opgeslagen...

Heeft iemand enig idee hoe ik dit moet oplossen? I'm all out of ideas

Alvast bedankt

Verwijderd

Is het niet mogelijk om de waarde in VB gewoon als een real of double op te slaan?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Een Currency in Delphi werkt dus heel anders als in VB en dat is niet zo heel vreemd. Los het op zoals NextGeneration voorsteld of probeer meer informatie te achterhalen over de binaire representaties van een Currency type onder VB en Delphi.

We adore chaos because we like to restore order - M.C. Escher


  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

wat is een csv -bestand ?
Waarom sla je iets op in VB in een binair bestand ?

[ Voor 52% gewijzigd door Brothar op 07-04-2003 15:58 ]

eagle


Verwijderd

Topicstarter
Het probleem is dus dat het opslaan van de gegevens door een totaal ander programma wordt gedaan en daar heb ik dus geen invloed op

Enne een CSV-bestand is een Comma Seperated Value-bestand (oftewel een hele reeks velden gescheiden door komma's)

[ Voor 33% gewijzigd door Verwijderd op 07-04-2003 15:59 ]


  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

oké. comma als scheidingsteken.
dan is het simpel.
Hoe groot is het te converteren bestand ?
geen vaste recordlengte , maar wel per record zelfde aantal comma's (=zelfde aantal velden) en 1 keer een linefeed ?

[ Voor 39% gewijzigd door Brothar op 07-04-2003 16:03 ]

eagle


Verwijderd

Topicstarter
Het bestand ongeveer 4 MB, maar dat is op zich het probleem niet --> Currency's van VB converteren naar Delphi (nou ja goed uitlezen is al een begin)

Verwijderd

Brothar schreef op 07 april 2003 @ 16:01:
oké. comma als scheidingsteken.
dan is het simpel.
Hoe groot is het te converteren bestand ?
geen vaste recordlengte , maar wel per record zelfde aantal comma's (=zelfde aantal velden) en 1 keer een linefeed ?
Het probleem is dus dat de data uit het binaire bestand niet goed doorkomt, csv heeft er dus helemaal niets mee te maken.

  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

ik las: doel=binair bestand, dan converteren naar csv
begrijp nu: bronbestand=binair

als je niet weet hoe VB een en ander opslaat, is conversie ook niet echt mogelijk.
Je moet wel weten wat waar staat, of door VB wordt verwacht te staan.

Het handigste is het bestaande VB programma aan te passen, en daarmee CSV weg te schrijven

[ Voor 78% gewijzigd door Brothar op 07-04-2003 16:20 ]

eagle


Verwijderd

Topicstarter
Sorry voor de verwarring brothar....

De Currency waarden worden opgeslagen in 8 bytes. Een voorbeeld uit het bestand (hexadecimaal)

9A 99 99 99 99 99 F1 66

Het leuke is dus dat dit een Currency zou moeten zijn (aaargh)

En zoals ik al zei het VB programma kan ik niet aanpassen aangezien dat door een ander bedrijf is gebrouwd (jaren geleden)

[ Voor 23% gewijzigd door Verwijderd op 07-04-2003 16:22 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Hahaul: voor mij lijkt de beste oplossing de volgende: stap van Delphi over op VB en creeer vanuit de VB app die je zelf gaat bouwen de CSV.
Op die manier kun je gewoon met Currencies werken in VB en kun je ze redelijk simpel converteren naar een voor jou leesbare waarde.

Andere optie: VB-app om currency te vertalen naar double of een float, vervolgens met jouw Delphi-app verder. Dit is natuurlijk heel smerig en alleen een optie als je een gegronde reden hebt om het niet in VB te willen maken.
edit:
bedenk me net dat dit wel een leuke bezigheid is voor een DLL!

[ Voor 8% gewijzigd door OZ-Gump op 07-04-2003 17:11 ]

My personal website


Verwijderd

OZ-Gump schreef op 07 April 2003 @ 17:09:
Hahaul: voor mij lijkt de beste oplossing de volgende: stap van Delphi over op VB en creeer vanuit de VB app die je zelf gaat bouwen de CSV.
Overstappen op VB, de vraag (nou jah, vraag) is of dat een goede stap is.
Maar dat is simpelweg de keuze van Hahaul.
Op die manier kun je gewoon met Currencies werken in VB en kun je ze redelijk simpel converteren naar een voor jou leesbare waarde.
Zeer zeker.
Andere optie: VB-app om currency te vertalen naar double of een float, vervolgens met jouw Delphi-app verder. Dit is natuurlijk heel smerig en alleen een optie als je een gegronde reden hebt om het niet in VB te willen maken.
edit:
bedenk me net dat dit wel een leuke bezigheid is voor een DLL!
Is daar niet gewoon al iets voor, ik zou zeggen kijk eens rond hier en daar.

Verwijderd

Verwijderd schreef op 07 April 2003 @ 16:21:
9A 99 99 99 99 99 F1 66

Het leuke is dus dat dit een Currency zou moeten zijn (aaargh)
Waarom reken je niet eens uit wat dat hexadecimale getal decimaal is? (sorry, maar ik heb te weinig tijd).

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

Verwijderd schreef op 07 April 2003 @ 15:48:
probeer te lezen krijg ik wel een 'leesbare' waarde terug echter geen correcte!
(tenzij jullie je kunnen voorstellen dat een kogellager 4.6076327788e+14 euro's mag kosten)
Van wat voor materiaal is dit kogellager gemaakt? Titanium lagers zijn best wel duur :)
Verwijderd schreef op 07 april 2003 @ 16:21:
De Currency waarden worden opgeslagen in 8 bytes. Een voorbeeld uit het bestand (hexadecimaal)

9A 99 99 99 99 99 F1 66

Het leuke is dus dat dit een Currency zou moeten zijn (aaargh)
Wat voor bedrag zou dit moeten zijn? Ik heb geen idee in wat voor formaat Visual Basic currencies opslaat, maar misschien kun je dat ontcijferen als je van een paar bedragen weet hoe ze er in hun binaire representatie uitzien. Als je dat weet, kun je zelf een conversieroutine schrijven van VB currency naar comma-delimited currency.

[ Voor 3% gewijzigd door Tomatoman op 07-04-2003 22:38 ]

Een goede grap mag vrienden kosten.


  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

is het een access database ?
zo ja: structuur ?

dat vroegere bedrijf; failliet ? of weigeren ze informatie te geven ?
er zijn ESCROW-regels. Daarmee kun je volgens mij wel inzicht krijgen in de database/datastructuur.

Wat was de opdracht destijds ? Kan zijn dat de opdrachtgever eigenaar is van de broncode.

om hoeveel artikelen gaat het ?
is het dan doenlijk om de stuksprijs opnieuw in te voeren ?


elke "currency"is altijd 8 bytes ?
ga die dan niet converteren, maar maak een "vertaaltabel"
meerdere produkten zullen dezelfde stuksprijs hebben, en dus dezelfde "currency"

[ Voor 33% gewijzigd door Brothar op 07-04-2003 21:20 ]

eagle


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16:32
Geen idee of dit overeenkomt met vb maar dit had ik gevonden:
CURRENCY
A currency number stored as an 8-byte, two's complement integer, scaled by 10,000 to give a fixed-point number with 15 digits to the left of the decimal point and 4 digits to the right. This representation provides a range of 922337203685477.5807 to -922337203685477.5808. The CURRENCY data type is useful for calculations involving money, or for any fixed-point calculation where accuracy is particularly important.

typedef CY CURRENCY;
The data type is defined as a structure for working with currency more conveniently:

C:
1
2
3
4
5
6
7
8
9
10
11
12
typedef union FARSTRUCT tagCY {
    struct {         
#ifdef _MAC          
        long          Hi;
        unsigned long Lo;
#else                
        unsigned long Lo;
        long          Hi;
#endif               
    };               
    LONGLONG int64;  
} CY; 

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.


Verwijderd

Topicstarter
Bedankt allemaal voor de reacties. Ik denk er niets anders op zit als currencies opslaan in VB (1,2,3,10,11,12 enzo) en dan binair vergelijken en kijken wat er veranderd en vanaf dat punt proberen een vertaal-routine te schrijven :/

Ik zal de code wel posten als ik heb werken.

Nogmaals bedankt allemaal

Verwijderd

Verwijderd schreef op 07 april 2003 @ 16:21:
Sorry voor de verwarring brothar....

De Currency waarden worden opgeslagen in 8 bytes. Een voorbeeld uit het bestand (hexadecimaal)

9A 99 99 99 99 99 F1 66

Het leuke is dus dat dit een Currency zou moeten zijn (aaargh)

En zoals ik al zei het VB programma kan ik niet aanpassen aangezien dat door een ander bedrijf is gebrouwd (jaren geleden)
VB Currency = Delphi Currency

Hit F1 -> Currency ->

?922337203685477.5808.. 922337203685477.5807

"Currency is a fixed-point data type that minimizes rounding errors in monetary calculations. It is stored as a scaled 64-bit integer with the four least-significant digits implicitly representing decimal places. When mixed with other real types in assignments and expressions, Currency values are automatically divided or multiplied by 10000."
Pagina: 1