Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[VB.NET] String naar VB code

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

  • bastv
  • Registratie: September 2005
  • Laatst online: 24-11 20:50
zal eerst de situatie uitleggen.
Ik ben bezig met een programma te maken om etiketten te printen.
Nu is per klant een etiket anders (99 van de 100 keer alleen de barcode)

Die barcode is dus variabel en de opbouw haal ik uit een database.

voorbeeld
klant1 wil : (10)debiteurnr(95)artikelnummer -> (10)100548(95)58884412
klant2 wil : (16)datum in ddmmyyy(95)artikelnummer > (16)27092007(95)58884412

in de programmatuur zijn de variabelen datum / artikelnummer (en nog veel meer) al gevult.

Nu doe ik een query "select barcodestring from etiketten where debiteurnr = 100548"
dan krijg ik als resultaat terug
Visual Basic:
1
"(10)" & debiteurnr & "(95)" & artikelnummer & "(55)bladiebla"

Nu wil ik dat vb dit niet als tekst ziet maar als vb code zodat debiteurnr etc word omgezet naar de variabele debiteurnr.
Nu krijg ik namelijk een barcode van
code:
1
"(10)" & debiteurnr & "(95)" & artikelnummer & "(55)bladiebla"

en niet
code:
1
(10)100548(95)58884412(55)bladiebla

String replace etc. werkt niet omdat vaak ook andere vb codes worden gebruikt
extreem voorbeel:
Visual Basic:
1
Left(RTrim("Materiaalcode1"),2) & Right(RTrim("Materiaalcode1"),4) & ddmmyy &"000000"& Rtrim(Cstr("Moederrol")) & String(6 - Len(Rtrim(CStr("Moederrol"))), " ") &  String(4 - Len(RTrim(CStr("As"))), "0") & RTrim(CStr("As")) & String(2 - Len(RTrim(CStr("Deler"))), "0") & CStr("Deler") & "A"


misschien beetje vreemd uitgelegd maar kan het niet echt duidelijker.

[ Voor 3% gewijzigd door bastv op 27-09-2007 14:36 ]


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:48

mulder

ik spuug op het trottoir

Kijk eens naar String.Format. Dan kun je dit bv in je db zetten "10{0}95{1}". Daarna doe je zoiets: String.Format(templateString, debiteurnr, artikelnummer)

oogjes open, snaveltjes dicht


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
je zoekt denk ik "Eval"

  • bastv
  • Registratie: September 2005
  • Laatst online: 24-11 20:50
Don Facundo schreef op donderdag 27 september 2007 @ 14:44:
Kijk eens naar String.Format. Dan kun je dit bv in je db zetten "10{0}95{1}". Daarna doe je zoiets: String.Format(templateString, debiteurnr, artikelnummer)
dit gaat niet werken omdat de barcodes heel verschillend zijn per klant.
na ff googlen is dat wel wat ik zoek.

maar helaas:
No, unfortunately there is no eval-like function in VB.NET. It is possible but you will have to compile a new assembly during runtime.

Wat ik nu heb is:
Visual Basic:
1
2
3
                    Dim sc As New MSScriptControl.ScriptControl()
                    sc.Language = "VBScript"
                    barcodestring = sc.Eval(barcodestring)

als ik als barcodestring opgeef 1+1 dan krijg ik netjes 2 als barcode maar als ik variabelen gebruik krijg ik niets.

met barcodestring
code:
1
projectnr & "dl3b"

krijg ik alleen dl3b te zien

hoe kan ik variabelen mee geven?

[ Voor 44% gewijzigd door bastv op 27-09-2007 15:35 ]


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Kijk eens naar de types in de System.CodeDom.Compiler namespace, die kunnen on the fly code compilen. Maar dan nog zul je flink wat gevogel met strings moeten doen om een codefragment te genereren wat je vervolgens aan kan roepen...

Enneh... codefragmenten in een database opslaan is niet echt "good practice" he. :)

  • bastv
  • Registratie: September 2005
  • Laatst online: 24-11 20:50
MrBucket schreef op donderdag 27 september 2007 @ 15:34:
Enneh... codefragmenten in een database opslaan is niet echt "good practice" he. :)
als je 50 klanten hebt die allemaal een andere barcode willen en deze wijzigen gemiddeld 2 keer per jaar.
en je hebt nog een 20 machines die labels printen dan is er niet echt een nette oplossing hiervoor.

  • ibmos2warp
  • Registratie: Januari 2007
  • Laatst online: 20-11-2023

ibmos2warp

Eval is Evil

offtopic:
Eval is evil... Probeer eval dus te vermijden zie

Ik weet alles van niks
Vind Excel ongelovelijk irritant.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
bastv schreef op donderdag 27 september 2007 @ 15:37:
[...]


als je 50 klanten hebt die allemaal een andere barcode willen en deze wijzigen gemiddeld 2 keer per jaar.
en je hebt nog een 20 machines die labels printen dan is er niet echt een nette oplossing hiervoor.
Hoezo niet? Je kan toch gewoon met format strings werken. Je hoeft echt niet precies de format strings zoals in string.Format gebruikt wordt gebruiken.
"(10)" & debiteurnr & "(95)" & artikelnummer & "(55)bladiebla"
zou je perfect als de volgende format string kunnen specificeren

(10)[debiteurnr](95)[artikelnummer](55)bladiebla

je zult dan wel iets moeten doen om dat om te zetten, maar dat hoeft niet echt heel erg complex te zijn.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • bastv
  • Registratie: September 2005
  • Laatst online: 24-11 20:50
rwb schreef op donderdag 27 september 2007 @ 16:35:
[...]

Hoezo niet? Je kan toch gewoon met format strings werken. Je hoeft echt niet precies de format strings zoals in string.Format gebruikt wordt gebruiken.


[...]

zou je perfect als de volgende format string kunnen specificeren

(10)[debiteurnr](95)[artikelnummer](55)bladiebla

je zult dan wel iets moeten doen om dat om te zetten, maar dat hoeft niet echt heel erg complex te zijn.
dat werkt vaak niet.
omdat barcodes vaak een vaste lengte hebben en sommige gegevens variabele lengtes hebben.
bijvoorbeeld palletnr moet 4 tekens lang zijn
als je pallet 1 hebt is dat dus 0001 en bij pallet 10 is dat dan 0010. en zo zijn er nog meer gevallen.
maar zal er nog eens een nachtje over slapen wat de mogelijkheden zijn.

  • /\/\|)
  • Registratie: Juli 2000
  • Laatst online: 21-11 12:02
Volgens mij maakt je het jezelf veel te moeilijk, of een veld vast of variabel van lengte is en wat de eventuele scheidingstekens zijn etc., kun je zonder meer verwerken in je format-string.

  • ? ?
  • Registratie: Mei 2007
  • Niet online

? ?

dit staat dus in je database:
"(10)" & debiteurnr & "(95)" & artikelnummer & "(55)bladiebla"

verander het in
(10){0}(95){1}(55){2}

en stop dat in mystring

{0} is het debiteurnr
{2} het artikelnr
{3} blabla

maak een array() met al je velden, zet index 0 als waarde debiteurnr, 1 het artikelnr

dan
code:
1
2
3
for i as integer=0 to array.length-1
   mystring =  mystring.replace("{" & i  & "}", array(i))
next

easy as pie

[ Voor 17% gewijzigd door ? ? op 28-09-2007 11:35 ]


  • bastv
  • Registratie: September 2005
  • Laatst online: 24-11 20:50
era.zer schreef op vrijdag 28 september 2007 @ 11:31:
dit staat dus in je database:
"(10)" & debiteurnr & "(95)" & artikelnummer & "(55)bladiebla"

verander het in
(10){0}(95){1}(55){2}

en stop dat in mystring

{0} is het debiteurnr
{2} het artikelnr
{3} blabla

maak een array() met al je velden, zet index 0 als waarde debiteurnr, 1 het artikelnr

dan
code:
1
2
3
for i as integer=0 to array.length-1
   mystring =  mystring.replace("{" & i  & "}", array(i))
next

easy as pie
ok en nu wil klant A een barcode met referentiecode zonder tekens erin
43.0249 moet dus worden 430249
hoe vang je dit af zonder de software later te moeten aanpassen?

of zoals dit? zijn die ook op die manier te doen?
Visual Basic:
1
Left(RTrim("Materiaalcode1"),2) & Right(RTrim("Materiaalcode1"),4) 

Visual Basic:
1
String(4 - Len(RTrim(CStr("As"))), "0")

  • /\/\|)
  • Registratie: Juli 2000
  • Laatst online: 21-11 12:02
Lees je eens in over string formatting. Wat jij wil, is allemaal tamelijk standaard.

  • bastv
  • Registratie: September 2005
  • Laatst online: 24-11 20:50
/\/\|) schreef op vrijdag 28 september 2007 @ 14:12:
Lees je eens in over string formatting. Wat jij wil, is allemaal tamelijk standaard.
heb al aardig wat doorgelezen.
alle funties die ik wil kunnen hier idd mee.

alleen kom ik er niet uit hoe ik die gegevens dan uit de database kan halen en omzetten.

de barcodeopbouw moet in de database komen te staan.
maar geeneen barcode is hetzelfde.
nog tips?

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Ik weet niet of het praktisch is of het beste in deze situatie, maar je zou altijd de objecten voor de String.Format in een bepaalde volgorde kunnen aanbieden en dan de index daarvan gebruiken in je barcode string. Bijvoorbeeld dat altijd debiteurnr overeenkomt met {0} en je die dus ook zo in je string opslaat.

Hoe zit het met de gegevensset die beschikbaar is en eventueel in een barcodestring kan voorkomen?

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • bastv
  • Registratie: September 2005
  • Laatst online: 24-11 20:50
de beste oplossing is zoiets als dit denk ik
Visual Basic:
1
2
3
Dim sc As New MSScriptControl.ScriptControl()
sc.Language = "VBScript"
barcodestring = sc.Eval(barcodestring)

als barcodestring 1 + 1 is krijg ik netjes 2 als barcode

kan iemand mij alleen uitleggen hoe ik hier variabelen aan mee geef ?
als ik namelijk een variabele als barcodestring gebruik krijg ik een lege waarde terug terwijl de variabele wel gevult is.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
bastv schreef op vrijdag 28 september 2007 @ 16:20:
kan iemand mij alleen uitleggen hoe ik hier variabelen aan mee geef ?
als ik namelijk een variabele als barcodestring gebruik krijg ik een lege waarde terug terwijl de variabele wel gevult is.
Nogal wiedes; die variabele is uit een compleet andere scope en dus (ook al heeft 'ie dezelfde naam) compleet onbekend.

Geloof ons nou maar dat eval ranzig en vies is en dat het nooit gaat werken zoals je wil. Verdiep je in het string-formatten (of desnoods met de replace functie %keywords% vervangen ofzo).

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
Dim MyString as String = "Uw artikel: %artikelnummer% met een prijs van %prijs% is %leverstatus% leverbaar"

MyString = Replace(MyString, "%artikelnummer%", MyArtnr)
MyString = Replace(MyString, "%prijs%", MyPrice.ToString("C"))
MyString = Replace(MyString, "%leverstatus%", IIF(Stock>0,"wel","niet").ToString)
'En zo nog b.v. 10 variabelen die wel/niet kunnen voorkomen in je 'template-zin'
'Uiteraard kun je hier ook prima weer een lusje om heen gooien zodat je bijv. %rs_fieldname% vervange met de value van dat field uit een recordset.

MsgBox(MyString)


Zo kun je met een replace functie heel snel bepaalde keywords/variabelen in een zin zetten (hoewel dat met string.format ook prima kan, maar dan zit je vast aan indexes)

[ Voor 20% gewijzigd door RobIII op 28-09-2007 16:37 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
bastv schreef op vrijdag 28 september 2007 @ 16:20:
de beste oplossing is zoiets als dit denk ik
Visual Basic:
1
2
3
Dim sc As New MSScriptControl.ScriptControl()
sc.Language = "VBScript"
barcodestring = sc.Eval(barcodestring)

als barcodestring 1 + 1 is krijg ik netjes 2 als barcode

kan iemand mij alleen uitleggen hoe ik hier variabelen aan mee geef ?
als ik namelijk een variabele als barcodestring gebruik krijg ik een lege waarde terug terwijl de variabele wel gevult is.
ik heb het zelf niet getest, maar werkt dit niet?

Visual Basic:
1
2
3
4
5
6
7
8
Dim a as string
Dim b as Integer
Dim c as Integer
a = "b"
b = 12
c = "8"

Eval(a & "+" & b)


overigens ben ik het er hardgrondig mee eens dat Eval = Evil :)

[ Voor 4% gewijzigd door P.O. Box op 28-09-2007 16:36 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:16

gorgi_19

Kruimeltjes zijn weer op :9

VB.Net kent geen Eval; wil je zoiets hebben zal je met CodeDom aan de gang moeten.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • bastv
  • Registratie: September 2005
  • Laatst online: 24-11 20:50
oplossing gevonden!

de middenweg is het geworden
in de database staat nu (om de eerste 5 posities van referentie1 te gebruiken)
code:
1
Left([referentie1], 5)


in het script staat nu
Visual Basic:
1
2
3
4
5
barcodestring = Replace(barcodestring, "[referentie1]", Referentie1)

Dim sc As New MSScriptControl.ScriptControl()
sc.Language = "VBScript"
barcodestring = sc.Eval(barcodestring)


op deze manier werk je niet met variabelen.
simpele oplossing keek er alleen telkens overheen
Pagina: 1