Ik ben bezig met een programma die bepaalde rollen met etiketten kan wegen en kan toevoegen aan een database. Deze rollen hebben allemaal een barcode.
De code die ik heb geschreven is ondertussen vrij lang maar de functie hier onder moet het volgende doen, Eerst opent hij de database(excel bestand) Dan haalt hij de barcode op die eerder door de gebruiker is opgegeven in een 'entry' veld. Hij controleert dan of de gebruiker wel degelijk iets heeft ingevuld (if Check.bar == ""
. Zo ja dan gaat hij op zoek in de data base naar deze barcode in een bepaalde colom van de datasheet. (zie code hieronder)
def Check():
Check.df = pd.read_excel('Database_etiketten.xlsx')
Check.bar = barcode.get()
if Check.bar == "" :
inputartnr.config(bg = 'Red')
popup()
else:
if Check.df['Barcode'].str.contains(Check.bar).any():
inputartnr.config(bg = 'White')
else :
inputartnr.config(bg = 'Red')
popup()
De code werkt vlekkeloos zolang de barcodes bestaan uit letters. Maar als ik cijfers gebruik als barcode is hij niet meer instaat ze te vinden. Hij gaat dan altijd over in wde tweede (laatse) else. Wat doe ik fout?
als mensen de hele code willen zien zal ik deze vanavond even uploaden(met kleurtjes dat leest makkelijker
)
mod edit
code tags toegevoegd. Juist python werkt niet zonder indents.
[Bericht gewijzigd door GJ_ op (0%)]
maartenbakker
Golden Member
www.elba-elektro.nl | "The mind is a funny thing. Sometimes it needs a good whack on the side of the head to jar things loose."
Op 23 augustus 2017 12:25:06 schreef maartenbakker:
Een getal is geen string,...
TS heeft het toch niet over een getal maar over cijfers 
Ik weet niet wat barcode precies voor een object is, maar het zou kunnen dat deze een int of float terug geeft als er een getal ingevuld wordt. Dus dan zo iets als str(barcode.get()).
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Voor sommige zaken zoals spreadsheet columns in .csv files moet je opgeven of een kolom met cijfers gezien moet worden als getal of als alfanumerieke string.
(misschien hier ook van toepassing?)
Op 23 augustus 2017 14:44:45 schreef sdk:
Ik weet niet wat barcode precies voor een object is, maar het zou kunnen dat deze een int of float terug geeft als er een getal ingevuld wordt.
Standaard geeft een scanner gewoon een rits met cijfers als string en geen getallen.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Volgens TS moet de gebruiker de barcode handmatig invoeren... (wat dan het nut van een barcode nog is, is me duister...
)
Gj, daarom vroeg ik me af wat barcode precies voor object is. Is het een deel van de scanner? Is het een invulveld in de gui?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Sorry sorry, haha de barcode kan door een gebruiker in een entryveld worden ingevuld (input = entry(main, variable=barcode, blablabla) ) maar de scanner die aan de pc hangt kan ook de barcode scannen. Deze typed hem dan als het ware in, in het entyveld.
Dan door Check.bar = barcode.get()
Wordt het uitgelezen. Dan ontstaat er met letters dus een string waarde en met cijfers ontstaat dan iets van een interger op de een of andere manier. En str(barcode.get()) werkt dus ook niet. Het blijft dan gewoon dat hij hem niet kan vinden in de Excel sheet.alsof cijfers niet herkenbaar zijn of iets degelijks
Ik weet niet hoe je met Python in je excel zoekt, maar excel kun je Vlookup dwingen om als text te zoeken
In vlookup voeg je dan &"" toe in je zoekID.
=VLOOKUP(barcode&"" ,barcodedata,2,0)
edit
str() toevoegen werkt dat ?
if Check.df['Barcode'].str.contains(str(Check.bar)).any():
ben niet zo into python (nog niet) maar wat ik als eerste dacht, je wil weten of er 'iets' in het entryveld zit. Wat als je cijfers en letters combineert?
Wat als je met vierkante haakjes werkt, zou een 'list' opleveren, lukt dat? Zou volgens mij een optie kunnen zijn.
Je zet 'barcode' toch ook in een list? Dus zou je met any() wel een leeg veld kunnen detecteren denk ik maar geen cijferveld. Tenzij je ook daar naar die lijst verwijst met any[barcode].
Weet je wat je in het entryveld krijgt met de scanner? Kan je dat even bekijken?
[Bericht gewijzigd door Appel op (31%)]
Op 23 augustus 2017 18:29:25 schreef Appel:
ben niet zo into python (nog niet) maar wat ik als eerste dacht, je wil weten of er 'iets' in het entryveld zit. Wat als je cijfers en letters combineert?
Wat als je met vierkante haakjes werkt, zou een 'list' opleveren, lukt dat? Zou volgens mij een optie kunnen zijn.
Je zet 'barcode' toch ook in een list? Dus zou je met any() wel een leeg veld kunnen detecteren denk ik maar geen cijferveld. Tenzij je ook daar naar die lijst verwijst met any[barcode].
Weet je wat je in het entryveld krijgt met de scanner? Kan je dat even bekijken?
Wat ik van de scanner binnen krijg is hetzelfde als dat je zou typen, de scanner staat nu namelijk ingesteld dat hij toetsaanslagen simuleert.
Op 23 augustus 2017 18:29:09 schreef Peter112:
Ik weet niet hoe je met Python in je excel zoekt, maar excel kun je Vlookup dwingen om als text te zoekenIn vlookup voeg je dan &"" toe in je zoekID.
=VLOOKUP(barcode&"" ,barcodedata,2,0)edit
str() toevoegen werkt dat ?
if Check.df['Barcode'].str.contains(str(Check.bar)).any():
Al geprobeerd, en werkt niet. En is vlookup een module?
maartenbakker
Golden Member
www.elba-elektro.nl | "The mind is a funny thing. Sometimes it needs a good whack on the side of the head to jar things loose."
Op 23 augustus 2017 14:41:14 schreef GJ_:
[...]TS heeft het toch niet over een getal maar over cijfers
Klopt, maar Excel gaat dat standaard als een getal zien (Arco hint ook al op zoiets). In een echte database zet je het veld op CHAR, in Excel kan dat natuurlijk ook door de velden het juiste type mee te geven, maar geen idee of dat goed gaat tussen Excel en Python. Ik heb trouwens geen ervaring met Python (wil daar ooit wel een keer een projectje in doen maar dat zal niet voor de nabije toekomst zijn), misschien dat je daar al met casting moet rommelen.
Verder zou ik de TS serieus in overweging geven om gewoon een database te gebruiken. MariaDB is tamelijk populair tegenwoordig, maar je hebt ook PostgreSQL, MySQL, etc.
[Bericht gewijzigd door maartenbakker op (14%)]
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Het is verstopt al een aantal keren gezegd: Excel voldoet niet als database.
De huidige problemen komen door het verwisselen van "getallen" met "strings". Voor een barcode is 8719179098375 een string van cijfers. Waarschijnlijk ziet excel het als getal (mogelijk zelfs als 8.719179e12, de laatste cijfers worden niet eens opgeslagen!)
Gebruik iets waar je opgeeft dat het een stringveld is.
Ook python kan stiekum ineens van de 87... string een getal maken. Ook dat kan roet in het eten gooien. Maar eerst die database.
Op 23 augustus 2017 18:54:12 schreef maartenbakker:
Verder zou ik de TS serieus in overweging geven om gewoon een database te gebruiken. MariaDB is tamelijk populair tegenwoordig, maar je hebt ook PostgreSQL, MySQL, etc.
Dat gaat niet, de vriend waar voor ik dit maak wil het perse in Excel kunnen openen. (Om zo zelf gemakkelijk bij de data te komen
buckfast_beekeeper
Van Lambiek wordt goede geuze gemaakt.
if Check.bar == "" :
inputartnr.config(bg = 'Red')
popup()
else:
if Check.df['Barcode'].str.contains(Check.bar).any():
inputartnr.config(bg = 'White')
else :
inputartnr.config(bg = 'Red')
popup()
Vind ik al niet logisch. Ik zou eerder voor
if Check.df['Barcode'].str.contains(Check.bar).any():
inputartnr.config(bg = 'White')
else :
inputartnr.config(bg = 'Red')
popup()
gaan.
Waarschijnlijk loopt het mis op .str.contains en zegt python dat het geen string heeft opgehaald. Hoe vang je de geworpen foutmelding op? Of is er geen foutmelding? Ik zou eerst controleren of er iets is opgehaald. Bij een recordset uit een echte database peace of cake. Daarna controleren of het een string betreft of een numerieke waarde. Is het dit laatste eerst een cast naar string en dan verder verwerken.
Kan maartenbakker alleen bijtreden. Excel is geen database. Het is een rekenblad dat misbruikt wordt. MariaDb is gratis. Wat houdt u tegen? Elke zichzelf respecterende programmeertaal heeft de nodige tools aan boord om een database aan te spreken en er zaken in te steken en weer uit te halen. ODBC is dan het toverwoord.
edit: Excel kan connecteren met je database. Haalt er uit wat je graag wil tot draaitabellen toe. Ik heb verschillende Excel bestanden die gegevens uit een database halen. Excel is wat makkelijker om bijvoorbeeld grafieken weer te geven.
Op 23 augustus 2017 18:52:07 schreef hollander:
[...]Al geprobeerd, en werkt niet. En is vlookup een module?
Vlookup is een excel functie , geeft echter het gelijke probleem
VLookup met een getal zoeken geeft andere resultaten als string zoeken, 123 wordt niet gevonden. DE cellen aanmerken als text en bij VLookup een "" achter de cijfer reeks te zetten gedraagt VLook zich als string zoeken
In excel een getal ingeven in een nummerieke cell met ' teken ervoor maakt het toch een string
Op 23 augustus 2017 19:09:26 schreef hollander:
Dat gaat niet, de vriend waar voor ik dit maak wil het perse in Excel kunnen openen. (Om zo zelf gemakkelijk bij de data te komen
Maak er een tekstbestand van. Dat kan door een miljoen programma's gelezen worden, waaronder Excel.