
Archiv der Kategorie: IT
Für die an Programmierung Interessierten
Hier gibt es einen recht interessanten Kanal:
https://www.youtube.com/@nicbarkeragain
I’m totally against it
The „cloud“ is a stupid and way too dangerous choice. My data is on my computer or my LAN. That’s where it belongs and should be kept.
Danke RCS
Tja, so kann es manchmal gehen, ich habe mich verrannt und meine SW „geschrottet“… Dank RCS konnte ich wieder auf eine funktionierende Version. Was für ein Glück.
Quite a good video
For the C Programmers among us:
Such things fascinate me
Es schreibt ein Ahnungsloser
Wie unterscheiden sich XRechnung und ZUGFeRD?
„XRechnung und ZUGFeRD sind zwei Standards für elektronische Rechnungen in Deutschland. Die folgende Tabelle zeigt die wichtigsten Unterschiede und jeweiligen Vor- und Nachteile auf einem Blick:
Feature | XRechnung | ZUGFeRD |
Format | Reiner XML-Standard | Hybrides Format: PDF mit eingebettetem XML |
Syntax | UBL 2.1 oder CII | CII |
Ziel | Automatische Verarbeitung | Menschliche Lesbarkeit und maschinelle Verarbeitung |
Verpflichtend | Für B2G seit 27.11.2020, für B2B ab 01.01.2025 | Freiwillig, aber weit verbreitet |
Vorteile | Hohe Automatisierung, fälschungssicher | Gute Lesbarkeit, flexibel |
Nachteile | Komplexere Erstellung, erfordert XML-Kenntnisse | Nicht so fälschungssicher wie XRechnung |
Erfahren Sie nun, wie sich die XRechnung in den letzten Jahren entwickelt hat und welche Verpflichtungen in den nächsten Jahren auf Sie zukommen werden.“
Meine Güte, wie kann man so einen Blödsinn schreiben? UBL und CII sind zwei XML-Formate, Rechnung und Zugriff erfüllen die Anforderungen an eine Rechnung EN16931:2017
Fälschungssicher ist der totale Blödsinn das Ganze sieht so aus:
<?xml version="1.0" encoding="UTF-8"?>
<ubl:Invoice xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
<cbc:ID>123456XX</cbc:ID>
<cbc:IssueDate>2016-04-04</cbc:IssueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:Note>#ADU#Es gelten unsere Allgem. Geschäftsbedingungen, die Sie unter […] finden.</cbc:Note>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
<cbc:BuyerReference>04011000-12345-03</cbc:BuyerReference>
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="EM">seller@email.de</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>[Seller trading name]</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>[Seller address line 1]</cbc:StreetName>
<cbc:CityName>[Seller city]</cbc:CityName>
<cbc:PostalZone>12345</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>DE</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>DE 123456789</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>[Seller name]</cbc:RegistrationName>
<cbc:CompanyID>[HRA-Eintrag]</cbc:CompanyID>
<cbc:CompanyLegalForm>123/456/7890, HRA-Eintrag in […]</cbc:CompanyLegalForm>
</cac:PartyLegalEntity>
<cac:Contact>
<cbc:Name>nicht vorhanden</cbc:Name>
<cbc:Telephone>+49 1234-5678</cbc:Telephone>
<cbc:ElectronicMail>seller@email.de</cbc:ElectronicMail>
</cac:Contact>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="EM">buyer@info.de</cbc:EndpointID>
<cac:PartyIdentification>
<cbc:ID>[Buyer identifier]</cbc:ID>
</cac:PartyIdentification>
<cac:PostalAddress>
<cbc:StreetName>[Buyer address line 1]</cbc:StreetName>
<cbc:CityName>[Buyer city]</cbc:CityName>
<cbc:PostalZone>12345</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>DE</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyLegalEntity>
<cbc:RegistrationName>[Buyer name]</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:PaymentMeans>
<cbc:PaymentMeansCode>58</cbc:PaymentMeansCode>
<cac:PayeeFinancialAccount>
<!-- dies ist eine nicht existerende aber valide IBAN als test dummy -->
<cbc:ID>DE75512108001245126199</cbc:ID>
</cac:PayeeFinancialAccount>
</cac:PaymentMeans>
<cac:PaymentTerms>
<cbc:Note>Zahlbar sofort ohne Abzug.</cbc:Note>
</cac:PaymentTerms>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">22.04</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="EUR">314.86</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">22.04</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>7</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">314.86</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">314.86</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">336.9</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">336.9</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<cac:InvoiceLine>
<cbc:ID>Zeitschrift [...]</cbc:ID>
<cbc:Note>Die letzte Lieferung im Rahmen des abgerechneten Abonnements erfolgt in 12/2016 Lieferung erfolgt / erfolgte direkt vom Verlag</cbc:Note>
<cbc:InvoicedQuantity unitCode="XPP">2</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">288.79</cbc:LineExtensionAmount>
<cac:InvoicePeriod>
<cbc:StartDate>2016-01-01</cbc:StartDate>
<cbc:EndDate>2016-12-31</cbc:EndDate>
</cac:InvoicePeriod>
<cac:OrderLineReference>
<cbc:LineID>6171175.1</cbc:LineID>
</cac:OrderLineReference>
<cac:Item>
<cbc:Description>Zeitschrift Inland</cbc:Description>
<cbc:Name>Zeitschrift [...]</cbc:Name>
<cac:SellersItemIdentification>
<cbc:ID>246</cbc:ID>
</cac:SellersItemIdentification>
<cac:CommodityClassification>
<cbc:ItemClassificationCode listID="IB">0721-880X</cbc:ItemClassificationCode>
</cac:CommodityClassification>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>7</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">288.79</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
</ubl:Invoice>
Es ist ein Textformat, das man in jedem Editor bearbeiten kann. Es gibt keine Prüfsummen und keinerlei Sicherheit gegen Fälschung.
Nachteile sind falsch, weil beide XML-Formate sind AFAIKT, läuft es bei Zugferd so, man generiert eine XML-Rechnung und generiert dann daraus das PDF.
Nur 2 von 6 Punkten sind richtig. Das ist jenseits von armselig.
Does anyone make it differently
My programming runs along these steps
1) try to understand (if in doubt write some code to tests)
2) make it work
3) restructure it
4) make it prettier
I try to get a handle to the problem. What do I have, what do I know, what do I have to learn to understand. After that I try to make something work which solves at least some kind of problem with the project. I’m not doing TDD in general. So sometimes I write a text beforehand and sometimes a test after the implementation. So I’m not writing test to fail always.
What I always do (but in the rare cases). I run the code a) through the compiler (if available) and b) run it in the debugger to check.
Most times I use object-oriented languages and object-based languages (in my case WLanguage and VBA) But I also have Java, C# installed and yes, I download libraries which I often find there to test things. Currently, it’s Xrechnung/Zugferd and for that, you can find:
https://www.mustangproject.org/?lang=de, https://www.e-rechnung-bund.de/standard-xrechnung-3-0-1/
What I think I have learned, going to the Java/C# track means loading tons of libraries. And I guess it is good working, but it’s terrible much and getting it needs time and if you believe it or not, there are better solutions for part of it in WLanguage e.g check XML handling: Just take a look here: https://doc.windev.com/en-US/?3081018
I don’t know if there is Software which works similar in Java or C#. But of course I may be wrong, just let me know if you know better.
Then to 2) the first implementation usually means hardly much structurung just writ it down. Yes, I’m using some Objects for it and of course I use methods/functions/procedures, Data Structures and Classes/objects. But it migh look like in a test like this:
obj is dynamic CUBL_Invoice
obj = new CUBL_Invoice(101268)
ds is Data Source = QRY_Verkauf
// obj.addInvoiceCommonDataHeader()
inv is dynamic xmlNode <description="UBL-Invoice-2_1.Invoice"> = obj.xmlDoc.Invoice
TestCheckEqual(inv.IssueDate, "20241014")
TestCheckEqual(inv.InvoiceTypeCode, 380)
TestCheckEqual(inv.DocumentCurrencyCode, "EUR")
obj.addSupplierInformation()
obj.addCustomerInformation()
obj.addPaymentMeans()
actQuery is Data Source = QRY_Verkauf
actQuery.paramSearchFor = 101268
HExecuteQuery(QRY_Verkauf)
HReadFirst(QRY_Verkauf)
IF HFound(actQuery) THEN
TestCheckEqual(obj.xmlDoc.Invoice.AccountingCustomerParty.Party.PostalAddress.Country.IdentificationCode, "DE")
END
HClose(actQuery)
obj.addTaxTotal()
obj.addMonetaryTotal()
obj.addInvoiceLines(GCS_CB_VERKAUF)
XMLSave(obj.xmlDoc, fParentDir(fCurrentDir()) + "\out\after_assign_InvoiceCommonHeader.xml", XMLFormatting+xvNoValidation)
So yes that does what it should do and is not well structures.
Then the 3) comes into play. I’m nearly always using Polymorphism and template methods. So I try to figure out some kind of a root class with the stuff which is needed in it and implement that. So I don’t have to care about that down the inheritance line.
There will always be some kind of methods to be overwritten /extended
Currently, it is this one: PROCEDURE addPart()
I’m building a XML document out of parts, and the parts are subclasses of the top class.
I try to improve on the naming, and for that, I’m grateful if there is at least some support for in the language I have to use. And there is but one tool which is always there in WLanguage and Access, you can run a compiler and fix the problems along the compilation errors. I can assure you it works, and it really helps.
I like the wording from tsoding daily about this „Compiler supported refactoring)
See this channel: https://www.youtube.com/@TsodingDaily
I really like this channel and the way he does things. I guess I’m not alone with that.
Any programmer among the few readers here, who like to share what they do/think?
I think one can say that.
But it’s easy to get out of it in many supposed to be statically typed languages.
I just can confirm that
I really tried to get it to useful work, but in my area (WLanguage and Windev) it’s simply faulty. Calls to functions which do not exist, and even after pointing it out, I get the same shitty code. It simply can’t work, and so it doesn’t. The only useful thing for me, is for me to get some oversight. What I do not understand, I was searching for everything around XRechnung/Zugferd/UBL and just over days there cams suggestions like XMLBeans, apache Camel and other stuff. It seems it’s quite better in areas like Java, and its tools. In my case, I probably was lucky, the code simple did not work, and did not work with terrible bugs.
Ich bin so beeindruckt
Bin kein großer Video-Spieler und eher unter eher schlecht als recht einzustufen. Aber heute war ich mal neugierig und habe Steam unter Linux installiert und was soll ich sagen? Ich bin begeistert, habe mir Aurora Hills geholt und ich liebe die Grafiken, es ist einfach schön. Mal sehen, was ich noch so finden werde. Für mich hat sich nur ein Block auf dieses Spiel schon gelohnt.
For programmers
or just people enjoying programming:
For programmers or those having just fun with programming. Solving Advent of Code with unusual choices
Vim:
Postgresql
https://www.youtube.com/watch?v=aIVBYKk5adk&t=130s
Emacs-Lisp https://www.youtube.com/results?search_query=solving+advent+of+code+emacs+lisp
Emacs-Lisp https://www.youtube.com/results?search_query=solving+advent+of+code+emacs+lisp
More:
https://www.youtube.com/results?search_query=advent+of+code
Murphy’s Law
Wahrscheinlich für Programmierer interessant
https://www.erlang-solutions.com/blog/comparing-elixir-vs-java/
Tja, leider sehe ich derzeit keinen direkten Nutzen für mich. Ich kann das, was ich mache, ohne Elixir oder Java erledigen, dennoch suche ich etwas, was ich vielleicht heute nutzen könnte, aber in der Zukunft gerne benutzen werde.
Ich benutzte gerne Smalltalk, nur sind die Kosten extrem hoch und die Lage, was Libraries angeht, um Größenordnungen schlechter. Web programming mit Database Zugriff und in meinen Größenordnungen braucht nicht mehr als Ms Access, das einzige wirklich Limit dort ist die Größe der Datenbank, dieses Problem ist mit Windev und Wlanguage kein Problem mehr und ich bekomme eine gute IDE mit Tools für Dinge, die ich wirklich brauche. (https://windev.com/).
Es ist tatsächlich nur interessant, nur nicht überragend wichtig für mich.
Breaking change are a terrible politics
If that is true, one cannot trust .NET. I’m sorry, I’m knowing too less about it, but it seems Java does it much better in this regards.
Hat sich kaum geändert
Wünsche und Beschwerden …
Ich weiß, das Leben ist kein Wunschkonzert, aber trotzdem darf man Wünsche haben. Es gibt eine Reihe davon aus meinem Programmerleben:
– VBA als vollständiges Mitglied der .NET Familie, das Gleiche bitte auch für die WLanguage
– Ein vernünftiger Editor für VBA (ohne die MZ Tools wäre es noch schlechter) MS kann offensichtlich IDEs, warum nicht für die in Office benutzte PS? Man schaue sich mal OpenGenera an und den dort benutzen ZMACS, das ganze OS kann man in Lisp Dialekten programmieren.
– ein vernünftiges Test-Framework für Ms Access. Man versteht, warum es keine Tests gibt und alle Programme im Debugger „entwickelt“ werden.
– Vernünftige Editoren für Smalltalks (egal welches, alle sind unkomfortabel und das für so eine wunderbare Sprache wie Smalltalk
– Ein Smalltalk für die .NET Familie
– Vernünftige GUI, Report Builder oder Tools für die Behandlung von Dateien und Verzeichnissen, für Smalltalks und spezieller Pharo. Warum gibt es nicht was zumindest Gleichwertiges in diesem Bereich zu ja selbst MS Access?
– Ein wirklich nettere PS für Latex (auch wäre ein visueller Report Builder eine nette Sache) Latex läuft, ist stabil seit mehr als20 Jahren und bringt besser Sachen aufs Papier als so gut wie jedes andere Programm .
– Ein GUI-Builder, GUI-Framework, für Emacs, damit man endlich mal auch das von der manuellen Erstellung von GUIS wegkommt.
Ganz massiv stört mich diese Sachen bei Smalltalk. Wenn das in Java möglich ist, dann schon lange in Smalltalk aber nein, damit befleckt man wohl die „Reinheit“ von Smalltalk …
Und ja mich ärgert es auch speziell bei VBA, weil es da schon so
lange gibt und VB ein Meilenstein für die Entwicklung von Windows Programmen war. Was macht MS damit … Es ärgert mich noch mehr, wenn ich daran denke, worauf der Erfolg von MS basiert. Es war nicht zuletzt das Basic von denen, was MS an die Spitze brachte und dann macht man so was platt?
Bei Emacs ärgert mich etwas, daß es Emacs Lisp gibt. Warum konnte es kein Common Lisp sein? Stallmann kannte es doch …
Und nein, ein Guile-Emacs gibt es immer noch nicht ernsthaft …
Ja, ich weiß mach’s doch selber … Tja Punkt ist, brauche das nicht für C#, Java, C, C++, Delphi, FreePascal, TurboPascal, VB, Dolphin Smalltalk machen und ’ne Zillion von Libraries gibt es auch ….
Ich schweige mal höflich über den Stand von IDE für die ach-so-tollen-funktionalen-Programmiersprachen … Ausnahme vielleicht F# auf Windows
Ich bin überzeugt gute Werkzeuge sollte es auch für Programmierer geben und nein, die Anbieter von funktionalen Sprachen, wie Haskell, leisten das nicht. Ernsthaft, wenn es um DBs geht und man, was für Anwender schaffen will, dann ist man mit MS Access besser bedient als mit jeder funktionalen PS.
Man verstehe vollkommen den Erfolg von Java, C# und so um Vergleich, weil diese Sachen einfach nützlicher sind. Und ja, es dürfte mindestens ’ne Million mehr Anwender und Programmierer für MS Access geben als für alle funktionale PS zusammen …
Manch werden mich auslachen, es liegt doch nur an Dir, was Du nützlich findest. Ist das wirklich so? Bin ich da so eine Ausnahme? Die Prediger für die Nützlichkeit von anderen Programmiersprachen sitzen m.E. teilweise auf einem zu hohen Ross‘ , keine Ahnung, ob es an mir alleine liegt, ich glaube nicht. Wenn ich an die Haskell-Evangelisten denke, dann sehe ich meine Meinung bestätigt, die Common Lisper sind leider auch nicht so viel besser … Wer die „Genialität“ der Tools von denen nicht erkennt, ist wohl einfach nur ein dummy …
Daher kommt mein Misstrauen:
Ich versuche mich mal wieder an Haskell und Webprogrammierung.
Status bisher:
– snap installation läuft Beispielprogramm kann nicht gebildet werden
– Spock installation schlägt fehl
– IHP nix muß man erst ans’s Laufen bekommen
Dagegen so vieles andere, Installation läuft. Erstes Beispiel läuft etc
Immer wieder liest man wie „toll“ Haskell ist, wenn man ein bisschen bohrt, dann passiert eben „so etwas!
Was für Zeiten
Heute haben mich Programmierer
wieder einmal positiv überrascht.
Weil ich ein wenig durch die Welt „gebrowsed“ habe, bin ich bei Lua hängengeblieben. (https://www.lua.org/) Erst einmal die Seite, klein, sauber und informativ. Und sofort zu lesen, das war schon top. Die Installation lief genauso wie auf der Seite beschrieben und das Ergebnis, das lua Programm ist nur 308 KByte groß. Nur zum Vergleich, der Python Interpreter ist 5,2 MB groß. (php8.2 5,5M) Ich habe nur einen Interpreter (io: https://iolanguage.org/) der kleiner ist. Dann werfe ich einen Blick in den Code und der sieht nach einem wunderbaren C aus. Die Compilation nimmt nur Augenblicke in Anspruch und der Quellcode mit Kommentaren ist gerade mal 25 000 Zeilen, beeindruckend wenig.
Ich habe noch keinen Deut darin programmiert, aber die Daten finde ich erstaunlich, die Seiten erfreulich, die ganze Software so unglaublich klein. Was für eine Leistung.
Älterer Mann, neue Tricks
Sieht so aus, als ob ein alter weißer Mann auch noch neue Tricks lernen kann.
Und das „locker“ nach mehr als 20 Jahren Emacs – Nutzung Man gewöhnt sich an E(sp)M(eta)A(lt)C(ontrol)S(hift), aber man liest auch immer wieder, daß bei typischen Editor Aufgaben die vi Nutzer schneller ans Ziel kommen, und man ist versucht, es damit aufzunehmen und voilà Evil -mode was born . Genau das liebe ich so an der Programmierung, es ist ernst, aber man macht sich lustig, entweder über Andere (wie b… kann man sein es so zu schreiben/implementieren) oder sich selber wie b … kann man sein so einen Bock einzubauen.
Ich denke nach so langer Zeit gebe ich DoomEmacs eine Chance, es ist etwas dabei, was ich gleich super fand, und zwar die doc. Wie super man das aufbauen kann, man erkennt es erst, wenn man es sieht, man ist wirklich betriebsblind, das hätte man sicher schon vor langer, langer, sehr langer Zeit selber implementieren können. Aber dafür hätte man …
Ja, ja hätte, hätte …
Was mir daran so gut gefällt?
Einfach
erst mal wird klargestellt um was es geht, aber dann gleich wo man es findet und dorthin wird verlink! Wow!
Dann kommt die signature (also wie man das Ding benutzt)
dann die Dokumentation und die ist bei allen Emacs-Lisp Funktionen mit dabei:
Dann gibt es ein Verlinken in das Handbuch und es wird besser
Es gibt einen Link find All references (also überall im ganzen Editor wo es gesucht wird kann man es sehen … irre)
Und alles mit Links draufklicken oder draufgehen und RET -> man ist da. Das ist so fantastisch. Integriert, das kann man wohl sagen …
Wird sich das umlernen bezahlt machen mal sehen im Zweifel bleibt einem immer noch C-z Wer auch immer dort draußen den Emacs benutzt, ich denke es lohnt sich einen genaueren Blick auf DoomEmacs zu werfen …
Sieht so aus
Als ob ich zum Ende meiner Refaktorierung komme. Es scheint, ich konnte 4 verschiedene Formulare mit 4 verschiedenen Abfragen auf 1 Form mit 1 Abfrage umprogrammieren. Es ist IMHO hilfreich, das Wissen was man hat, in Objekten/Strukturen unterzubringen. Der Code ist bislang nicht perfektioniert, aber immerhin statt 4 Formen mit Code von 120 Zeilen ist es nur noch eine Form mit rund 140 +/- 20 Zeilen.
So sieht der ersetzte Code aus:
'Dim intAntwort As Integer
'Dim strNeueZeile As String
'strNeueZeile = Chr$(10) & Chr$(13)
'
'Dim intSchleife As Integer
'Dim lngNr As Long
'Dim lngDrucker As Long, strBericht As String
'
'Dim WSP1 As Workspace, DB1 As Database, Tabelle1 As Recordset
'Set WSP1 = DBEngine.Workspaces(0)
'Set DB1 = WSP1.OpenDatabase(strDatenbankGlo)
'
'Set Tabelle1 = DB1.OpenRecordset("HT_Nummernkreise", DB_OPEN_TABLE) ' Tabelle öffnen.
'
'If Forms!HF_AuftrAnkErz!AngebotKz = True Then
' ' Rückfrage mit Speicherung der Antwort
' intAntwort = MsgBox("Für diesen Auftrag wurde bereits ein Angebot gedruckt!" & strNeueZeile & "Wollen Sie diesen Ausdruck wiederholen?", 33, "Angebot drucken?")
' If intAntwort = 2 Then
' GoTo Exit_DruckAngebot_Click
' End If
'End If
'
'' Firma Beller
'If strKundeNr = "143" Then
' strBericht = "BR_DruckAngebotAnkErz_Bel"
'Else
' strBericht = "BR_DruckAngebotAnkErz"
'End If
'
'ordneDruckerZu "Angebot", strBericht, HAUPT_DRUCKER
'
'' Prüfen ob Kontrollkästchen für Seitenansicht aktiviert
'' wenn aktiviert dann Seitenansicht, ansonsten Ausdruck auf Drucker
'If Me!Seitenansicht = True Then
' DoCmd.OpenReport strBericht, acViewPreview
'Else
' Tabelle1.MoveLast ' Letzten Datensatz suchen.
' setzeFelder Forms!HF_AuftrAnkErz, Tabelle1, DRUCK_BEREICH_ANGEBOT
' erhoeheNummer Tabelle1, "AngebotNr"
'
' Forms!HF_AuftrAnkErz!AngebotKz = True ' Setzen der Druckkennziffer
' Forms!HF_AuftrAnkErz.Refresh
'
' ' Logbucheintrag
' If DLookup("[Benutzerverwaltung]", "HT_SysParameter") = True Then
' Call SetzeBenutzerLog("Drucke Angebot m. Summen Ankauf Erz.-Preis! Auftrag Nr: " & CStr(Forms!HF_AuftrAnkErz!AuftragNr) & ", Angebot Nr: " & CStr(Forms!HF_AuftrAnkErz!AngebotNr))
' End If
'End If
Also grob 4 * 120 = 480 (es kommen wahrscheinlich noch ein paar Zeilen dazu, wegen eines Berichts, der genau auf die Anforderungen eines Kunden zugeschnitten war, die Logik ändert sich aber nicht, auf, sagen wir mal 160 LOC, 60 – 70 % weniger Code. Macht bei 500 000 Loc rund 600 / 500 000 * 100 = 0,12 % 😉 und 3 Formulare weniger … Nicht beeindruckend, wenn man aber betrachtet, in wie vielen Bereichen man das erreichen könnte. Wäre eine erste Schätzung, daß man den Code auf 160 / 600 = 26,6 % runter brächte, was dann auf gerade mal 125 000 Zeilen von Code hinausliefe, ohne Einbußen bei der Funktionalität. Wenn man dann noch die extrem aufwendige Übergabe an diverse Buchhaltungssysteme auf Datev herunterschraubte (was wohl jede Fibu in D einlesen kann) … Da kann man mal sehen, was nur eine andere Strukturierung an Vorteilen brächte und wie viel weniger Fehler gäbe es und wie viel einfacher wäre eine Korrektur? Sollte ich mal einen Fehler in den Angeboten finden, bräuchte ich nur eine Methode ändern statt … Mal sehen wie’s weitergeht. Es kommt wohl etwas dazu, weil es das Ziel ist, alle Reports auch als Email versenden zu können. Mal schauen…
Passend zu den letzten Einträgen
Ich schrieb, daß ich mich auf einen neuen Trip begebe, ich möchte anfangen F# intensiver zu benutzen. Ich hole noch ein bisschen aus, um meinen Hintergrund zu verstehen. Ich bin a) nicht mehr der Jüngste und b) ca 30 Jahre Programmierer +/- 10 Jahre. Die 10 Jahre kommen von meinen „leichten“ Kontakten zur Programmierung. Weil es beim Bund für Wehrpflichtige die Möglichkeit gab, Kurse zu belegen, habe ich bei einem dBase Kurs mitgemacht. OS: CPM und dBase II Bildschirm vielleicht 80 x 24 Zeichen, ich weiß es nicht mehr. Eines meiner ältesten Bücher aus der Zeit ist vom Franzis Verlag, Titel Die beiden Datenbanksysteme dbase II und III, Datum im Buch 1986.
Das ergibt 2022 – 1986 = 36 Jahre, tja und in der Schule habe ich auf einem TI irgendwas mit Basic angefangen. Somit ja das mit der Zeit kommt hin. Dann kam der erste PC in ’s Haus. Ein Atari ST , RAM 1024 MB , Platte 20 MB!, sauteuer aber cool. Da ein wenig in die Programmierung reingeschnuppert, aber nie was auf die Reihe bekommen. Dann kam das Studium an der Uni Karlsruhe und der erste Kurs war Modula-2. Ich habe bisher nichts öfter wiederholt als diesen Kurs. Ich bin, was programmieren angeht, kein schneller Lerner, aber hartnäckig nehme ich an. Der Kurs war irgendwann geschafft und dann kam C und keine Ahnung, von da an lief es, was programmieren angeht besser. Absurd, wenn man daran denke wie viele lesbarer Modula-2 Code ist als C (wenn man es nicht gewohnt ist). Trotzdem scheint es für mich leichter gewesen zu sein Den Kurs habe ich sofort bestanden. Dann kam Eiffel und darin habe ich angefangen ernsthaft Software zu schreiben. Es gibt noch ein paar Paket dort draußen in denen ich meine Finger reinsteckte siehe: https://fam-dominicus.de/tiki/tiki-index.php?page=FriedrichsTiki . Vielleicht sollte ich die Quellen mal irgendwan zugänglich machen.
Dann gründete ich die Q-Software Solutions und die Idee war ursprünglich eine Nachfolgersprache für Eiffel zu entwickeln Q. Die Idee damals: strikte Trennung CQS. Der Teil mit Status sollte OO mässig aufgebaut sein, der Rest funktional. Naja wir hatten etwas was prinzipiell funktioniert aber es war ein totaler wirtschaftlicher Reinfall, es wurde nie fertig und verschlang wirklich viel Geld ….
Hier noch ein bisschen Code der damals lief …
https://fam-dominicus.de/tiki/tiki-index.php?page=FriedrichsTiki
class Argv_test -- Main
creation
make
local
i : Integer;
args: Arguments;
do
args := new Arguments.make;
out := new Standard_output;
i := 1;
loop
until i > args.argument_count
out.print_string("argument ");
out.print_integer(i);
out.print_string("= ");
out.print_mutable_string(args.argument(i));
out.print_newline;
i := i + 1;
endloop
out.print_string("program name = ");
out.print_mutable_string(args.program_name);
out.print_newline;
end;
public
out: Standard_output;
endclass
Es compilierte nach C und deswegen habe ich mich mit Jacob Navia zusammengetan.( https://lcc-win32.services.net/. Die Zusammenarbeit war lang und erfreulich. Und nun gebe ich ein wenig an, wir waren unter den Ersten, die diesen Compiler auf 64-bit portierten, damals für eine Firma, die das benutzen wollte, um SQL Queries für ihre Datenbank zu kompilieren. Es gab auch eine Firma, die ein 5-GL Sprache anbot, die nach C kompilierte, das C war lcc-win32. Ich glaube die Schnittstelle nach C von Q war eine der einfachsten, die es damals gab und vielleicht heute noch gibt:
Da kam also einiges an Erfahrung mit C dazu. Es ist heute immer noch eine PS, die ich schätze. Aber PS haben einen „leicht“ addiktiven Effekt und ja, die Idee von Q ist immer noch präsent. Über die Zeit habe ich mir dann immer mehr PS angeschaut, manche angeeignet, einige relativ umfassend, andere so la la und manche eher schlecht als recht.
Ich zähle einfach nur auf (ohne zu sagen wie gut oder schlecht ich damit zurecht komme) , C, Eiffel, Turbo Pascal, Perl, Tcl/Tk, Ruby, Python, Common Lisp, Scheme, Smalltalk, D, Java, C#, Emacs Lisp, Erlang, Racket, IO, Self, Dylan, Ocaml, div. Assembler, VBA, WLanguage, C##
Man sieht, eher auf der OO Seite, wie ich aber vor zwei Tagen schrieb ist mir Java und C# irgendwo zu „verbose“, ich muß zuviel schreiben und lesen um zum Kern zu kommen, deshalb denke ich werde ich mit F# auf .NET gut fahren. Wie geschrieben, ich denke, man sollte alle Hilfe beim Programmieren benutzen, derer man habhaft werden kann. Es gibt aber ein paar Sprachen, in denen ich mir zutraue, etwas hinzubekommen, die ich aber nicht mag und ganz oben sind da C++ und Perl. Die sind IMHO zu kompliziert, aber ich kann weit daneben liegen.
Ich warte derzeit eine Software seit mehr als 10 Jahren, eine MS-Access Lösung. Sie funktioniert, ist aber ein Ärgernis, was Wartung und Weiterentwicklung angeht. Ich arbeite daran, aber …
Also wohin und was tun. Ich denke nach dem Abwägen der Möglichkeiten und der eigenen Vorlieben und Können sollte ich mit F# durchaus zurande kommen. Auf der anderen Seite sehe ich dann Videos wie:
Was mich einfach abschreckt und das sieht für mich nach kompliziert aus, ohne einen Gegenwert. Ich denke, ich möchte keine manuelle Speicherwaltung und ich möchte mich nicht mit Referenzen und Eigentum von Objekten auseinandersetzen. Ich möchte eine einfach lesbare Lösung und Sprache und F# könnte es sein. Ich denke auch die Trennung von OO und FP dürfte in F# funktionieren und wenn’s nicht klappt, kann ich immer noch C# Klassen benutzen 😉
Zum letzten Eintrag
Ich schrieb ja, ich werde mich auf einen neuen Trip begeben und F# intensiver nutzen.
Heute habe ich auf chatgpt+ geupdated und ich denke es werden gut angelegte 25 € im Monat sein. Zumindest hat es mir schon mal geholfen, einen Code zu erstellen, den ich heute wohl noch verwenden werde. Das hielt ich daher auf FB fest:
Ich habe mich etwa intensiver mit chatgpt beschäftigt und ich weiß, man sollte mit Superlativen vorsichtig sein. Ich denke aber das wird mein Programmiererleben und das der zukünftigen Programmierer mindestens genauso verändern wie die Suchmaschinen im WWW.
Ich sehe, es in den vielen youtube Videos, die meisten benutzen nicht man etwas wie `man` sondern tippen es gleich in die Suchmaschine ein und kopieren dann den Code in 0, nichts.
Es ist absolut hilfreich, wenn man sich in neue PS einarbeitet und der Code ist m.E. von guter Qualität, und wenn er dann noch gleich kompiliert und läuft ist es „nur“ der Punkt auf dem i 😉
Betrachten wir die Vergangenheit haben Maschinen massiv dazu beigetragen, die Produktion zu erhöhen und wir leben in derartig guten Zuständen (auch wenn es klar durch die Irren in der Politik in die falsche Richtung geht) dank der Mechanisierung. Ich denke durch Maschinen wie chatgpt können wir so etwas auch für die Programmierung sehen. Ich weiß noch nicht, wie und ob sich die Codequalität ändern wird, ich tippe auf eine Verbesserung, aber auch auf mehr Duplizierung in Code – mal sehen. Ein paar Jahre habe ich ja noch … (wahrscheinlich)
Ich denke, für Programmierer wird es auf erfreuliche Weise interessant
FD auf FB (FD = Friedrich Dominicus)
Ich glaube, ich gehe auf ’nen Trip
Mit einer von mir bisher wenig gebrauchten PS. Ocaml aka F#. Warum? Nun ich würde gerne Smalltalk benutzen, aber ich möchte auch so viel wie möglich Compilerunterstützung gegen Typos und andere Fehler nutzen. Ich denke mir, was der Computer testen kann, soll er auch testen. Ich mag es weiterhin nicht, mich zu wiederholen, als wäre ich eine gesprungene Schallplatte:
LongPathToSomeJavaClass<withTemplate1, withTemplate2> = myClass = new LongPathToSomeJavaClass<withTemplate1, withTemplate2>()
Ja, ich weiß, man braucht es nach dem New nicht mehr so zu schreiben. Was mir auch nicht so gefällt, wenn ich die Methoden in OO-Weise aufliste MyList.map(some function).filter(someCondition) …
Und ja, seiteneffektfreie Funktionen sind auch schön zu haben. IM Vergleich sieht
F# so aus:
let mutable i = 1
in
let rec loop() =
printf "i= %d >" i
let input = Console.ReadLine()
if input = "exit" then
exit(0)
else
printfn "You typed: %s" input
i <- i + 1
loop()
loop()
Es ist typsicher, ohne dass man es deklarieren muß. Man kann aber:
Also kann ich auch schreiben let mutable i:int = 1. Auf der anderen Seite ist e s nicht so jerkish wie Haskell: http://learnyouahaskell.com/input-and-output.
Ich finde, man kann es ziemlich „locker runter lesen – und verstehen. Mir gefällt vor allem auch ein Schlüsselwort wie ‚mutable‘, damit teilt man F# mit, hey ich werde das ändern und man macht es dann einfach (i <- i+1)
Und vor allem mag ich es, wenn man Daten auch in Objekte packen kann, mit Polymorphismus (die Haskellianer verstehen etwas anderes als der Rest der Welt darunter) . Ich sehe hier wirklich eine Obermenge von Programmerweisen.
- Simpel und „dumm“ prozedural let a … let b let c
- funktional (keine Seiteneffekte, keine Überraschungen bei Aufruf von Funktionen
- objektorientiert (da kenne ich mich nun mal am besten aus und mir kommt es in meinem Programm am weitesten entgegen.
Ich schrieb ja oben von Smalltalk, ich kann viel von OCaml auch in Smalltalk bekommen (schließlich sind Blöcke nicht anderes als Funktionen. Aber nichts warnt mich während der Entwicklung ,wenn so was passiert (pseudo code)
aHouse := aCrodocile
.
.
.
aHouse openDoor.
Ja, die IDES werden einen vielleicht warnen, aber im Endeffekt, wird uns zur Laufzeit mitgeteilt, da liegst’e mit dem Typ aber daneben. Das kann einem in Ocaml, F# und Haskell nicht passieren. Weithin passt F# komplett in die .NET Welt. Mir wäre kein Smalltalk bekannt, für das das gilt, ja es gab mal ich glaube IronSmalltalk oder so, aber AFAIK gibt es derzeit keine Unterstütztes auf Windows. Ich glaube eine Kombination in einer Sprache, die einen nicht bevormundet ist eine der besten Lösungen. Ich werde mal sehen, wohin mich dieser Trip führt, vielleicht liege ich falsch.
Es wäre nicht das erste Mal und nicht das letzte Mal. Ich werde mal sehen wie’s läuft und ich denke, man kann in diesem Blog auch nachlesen, wenn ich meine Meinung zu etwas geändert habe. Vielleicht passiert es wieder mit F#, vielleicht auch nicht …
Für mich als Einzelprogrammierer gibt es ein paar Wege. Ich kann wie Millionen von andere auf die großen Spieler setzen, ich kann etwas nehmen, was für meinen Bereich am besten zu gebrauchen ist und ich kann nehmen, was mir eher gefällt und auch wenn ich es von Eiffel anders kenne, sehe ich durchaus einen Punkt in dem Sprichwort: „In der Kürze liegt die Würze“
Man kann den Code ja mal in Java, C# oder C++ programmieren und schauen, wie es dann aussieht …
Erstaunlich
wie schnell ich eine Seite nicht mehr mag:
https://www.axon.dev/about-us
Meine Güte, muß das so sein. Ja, man sieht, sie lieben JavaScript. Aber viel hilft nicht immer viel …
Meistens geht es hier um Politik
Speziell, wie wahnsinnig und menschenverachtend die inzwischen geworden ist.
Es ist aber nicht mein einziges Steckenpferd ;-). Es klang sicher schon gelegentlich an, daß ich Programmierer bin. Ich pflege seit mehr als 10 Jahren eine Branchenlösung für Abfallbetriebe, Containerdienste. Das Ganze ist für kleine Betriebe mit weniger als sagen wir mal 5 AP für die EDV. Das sind nach meinem Wissen so ca maximal so um die 50 Leute die mit der Software bedient werden. Die meisten Dateneinträge dürften Wiegungen sein. Für jede komplette Wiegung braucht es, so gut wie immer zwei Wiegungen. Ich denke, die Software wurde schon zu DOS Zeiten entwickelt, vielleicht liege ich damit aber auch schief. Wie auch immer, die Programmiere haben m.E. a) relativ typisch in MS Access programmiert und b) wenig über die Menge an Code nachgedacht. Im Zweifel lief es wohl so. Da läuft was, wir kopieren es und passen es halt an. So gibt es Redundanzen noch und nöcher, aber natürlich nicht komplett, das wäre ja zu einfach. Wo man die Redundanzen sehr gut sehen kann, ist an folgendem Code:
Private Sub DruckAngeboSum_Click()
On Error GoTo Err_DruckAngeboSum_Click
Dim objOut As CMediaOutput
Set objOut = generateMediaOutputObjects(ActiveControl.Name)
objOut.doOutput
'Dim intAntwort As Integer
'Dim strNeueZeile As String
'strNeueZeile = Chr$(10) & Chr$(13)
'
'Dim intSchleife As Integer
'Dim lngNr As Long
'Dim lngDrucker As Long, strBericht As String
'
'Dim WSP1 As Workspace, DB1 As Database, Tabelle1 As Recordset
'Set WSP1 = DBEngine.Workspaces(0)
'Set DB1 = WSP1.OpenDatabase(strDatenbankGlo)
'
'Set Tabelle1 = DB1.OpenRecordset("HT_Nummernkreise", DB_OPEN_TABLE) ' Tabelle öffnen.
'
'If Forms!HF_AuftrAnkErz!AngebotKz = True Then
' ' Rückfrage mit Speicherung der Antwort
' intAntwort = MsgBox("Für diesen Auftrag wurde bereits ein Angebot gedruckt!" & strNeueZeile & "Wollen Sie diesen Ausdruck wiederholen?", 33, "Angebot drucken?")
' If intAntwort = 2 Then
' GoTo Exit_DruckAngeboSum_Click
' End If
'End If
'
'' Firma Beller
'If strKundeNr = "143" Then
' strBericht = "BR_DruckAngebotAnkErzoSum_Bel"
'Else
' strBericht = "BR_DruckAngebotAnkErzoSum"
'End If
'
'ordneDruckerZu "Angebot", strBericht, HAUPT_DRUCKER
'
'' Prüfen ob Kontrollkästchen für Seitenansicht aktiviert
'' wenn aktiviert dann Seitenansicht, ansonsten Ausdruck auf Drucker
'If Me!Seitenansicht = True Then
' If strKundeNr = "143" Then
' strBericht = "BR_DruckLiefschAuftrAnkErzNot_Bel"
' Else
' strBericht = "BR_DruckLiefschAuftrAnkErzNot"
' End If
' DoCmd.OpenReport strBericht, acViewPreview
'Else
' Tabelle1.MoveLast ' Letzten Datensatz suchen.
' setzeFelder Forms!HF_AuftrAnkErz, Tabelle1, DRUCK_BEREICH_ANGEBOT
' erhoeheNummer Tabelle1, "AngebotNr"
'
'
' druckeBericht "Angebot", strBericht, Me!AnzahlDrucke
'
'
' Forms!HF_AuftrAnkErz!AngebotKz = True ' Setzen der Druckkennziffer
' Forms!HF_AuftrAnkErz.Refresh
'
' ' Logbucheintrag
' If DLookup("[Benutzerverwaltung]", "HT_SysParameter") = True Then
' Call SetzeBenutzerLog("Drucke Angebot o. Summen Ankauf Erz.-Preis! Auftrag Nr: " & CStr(Forms!HF_AuftrAnkErz!AuftragNr) & ", Angebot Nr: " & CStr(Forms!HF_AuftrAnkErz!AngebotNr))
' End If
'End If
Exit_DruckAngeboSum_Click:
On Error Resume Next
' Tabelle1.Close
' DB1.Close
Exit Sub
Err_DruckAngeboSum_Click:
If err = 2501 Then
Me!Schließen.SetFocus
Else
MsgBox Error$
End If
Resume Exit_DruckAngeboSum_Click
End Sub
Die drei Zeilen Code oder so sind das was nach dem Überarbeiten bleibt.
Ein paar Dinge dürften Programmierer in neueren Sprachen durchaus verunsichern, das sind die Label zu denen man springt. Ja, das kann man inzwischen anders lösen und nein, es ist recht typisch für VBA. Man sieht, nur für die Fehlerbehandlung kommen „locker“ 5- 10 Zeilen Code zu jeder Funktion. Insgesamt sind es über 500 000 Zeilen an Code und viele Methoden gehen über mehrere Seiten.
Wie man sehen kann, gibt es keine Trennung der Bereiche. In einer Methode/Funktion gibt es Zugriffe auf die Datenbank, Manipulation der UI und Interaktion mit dem Benutzer. Ich befürchte, daß ist immer noch Stand der Dinge bei sehr vielen Access Programmen. Als wirklich ernsthaftes Problem sehe ich das Fehlen von brauchbaren Testmöglichkeiten an. AFAIK gibt es AccUnit zum Testen, das bekomme ich hier nicht installiert und ich bin derzeit immer noch zu faul um mich dahinterzuklemmen.
Die Klasse, in der ich es auslagerte, sieht der Code nun so aus:
Public Sub doOutput()
Dim bAdjustNumber As Boolean
Dim objControl As CControlNummernKreise
On Error GoTo HandleError
Dim iAuswahl As Integer
If outputMedia = outMediumPreview Then
outputPreview
GoTo HandleExit
End If
bAdjustNumber = True
If NZ(actForm(textFieldNumberName), "") <> "" Then
iAuswahl = askToReprintIfPrintedBefore()
If iAuswahl = vbNo Then
GoTo HandleExit
Else
bAdjustNumber = False
End If
End If
Set objControl = actualizeFormDataBeforePrint()
actualizeNumberCircle objControl, bAdjustNumber
Set objControl = Nothing
actionBeforePrint
If outputMedia = outMediumPrinter Then
outputPrinter
Else
outputEmail
End If
actionAfterPrint
actualizeFormDataAfterPrint
writeLog
HandleExit:
On Error Resume Next
Exit Sub
HandleError:
If err.Number <> 0 Then
MsgBox "Error " & err.Number & " (" & err.Description & ") in procedure doOutput."
End If
GoTo HandleExit
End Sub
Sicher noch reichlich zu kritisieren, aber ich denke, eine Verbesserung ist zu erkennen.
Der Witz an dieser einen Methode ist: Die kann ich so an ungefähr 8 Stellen so benutzen und muß da nichts mehr anfassen. Ich muß die Daten entsprechend vorbelegen
Case FRM_AUFTRAG_ANKAUF_ERZ
If sKundeNr = "143" Then
objResult.reportName = "BR_DruckAngebotAnkErz_Bel"
Else
objResult.reportName = "BR_DruckAngebotAnkErz"
End If
objResult.logEntry = "Druck Angebot Ankauf Erz. m. Summen Auftrag Nr: " & NZ(objResult.orderNo, 0) & _
", Angebot Nr: " & NZ(objResult.actForm(objResult.textFieldNumberName), "")
objResult.lblFuerKLNr = "Lieferant Nr:"
Set objParameterAngebot = parDruckAngebot_WH()
objParameterAngebot.mainTableName = "HT_AuftragAnkaufErz"
objParameterAngebot.subTableName = "UT_AuftragAnkaufErz_Positionen"
objParameterAngebot.fieldNameKLNo = "LieferantNr"
gen, aber die Logik dieses Teils geht nicht verloren. Ich denke, daß ist einer meiner Lieblingstechniken, einen Algorithmus austüfteln und dann möglichst nicht mehr anfassen zu müssen. Sollte was schiefgehen, dann habe ich hier eine zentrale Anlaufstelle, um es zu korrigieren und muß nicht die Korrektur 8 mal wiederholen.
Leider macht es einem VBA unglaublich schwer Code wiederzuverwenden, denn obwohl das hier eine Klasse ist, kann ich nicht einfach davon ableiten und nur die Sachen umschreiben, die ich brauche. Ja, es gibt Interfaces, aber die muß man dann von a-z in allen Klassen implementieren, das ist einfach schlecht und dürfte Leuten, die mit Java, Python, Ruby oder so gut wie jeder anderen OO-Sprache programmieren, die Tränen in die Augen treiben. Die Dinge sind aber nun mal, wie sie sind. Modularer bekäme man es nur hin, wenn man jede Methode in ein eigenes Interface auslagerte und dann die Interfaces implementierte, die einzige zugängliche Methode wäre dann z.B. für
If outputMedia = outMediumPreview Then
outputPreview
GoTo HandleExit
End If
outputTo aber man müsste halt all notwendigen Daten in diesem Interface hinterlegen und bräuchte zumindest ein paar Parameter oder ein Parameter Objekt.
Dann könnte man ein Interface haben für eine Klasse mit dem Namen OutputPreview
und den Wert so setzen
objIf as OutputInterface
if Test_If_Angebot then
set objIf = new OutputInterfaceAngebot
...
:..
und riefe es so auf
objIf.outputTo
Es geht leider nicht anders und dann bekommt man eben auch so etwas:
Case FRM_AUFTRAG_ANKAUF_ERZ
If sKundeNr = "143" Then
objResult.reportName = "BR_DruckAngebotAnkErz_Bel"
Else
objResult.reportName = "BR_DruckAngebotAnkErz"
End If
objResult.logEntry = "Druck Angebot Ankauf Erz. m. Summen Auftrag Nr: " & NZ(objResult.orderNo, 0) & _
", Angebot Nr: " & NZ(objResult.actForm(objResult.textFieldNumberName), "")
objResult.lblFuerKLNr = "Lieferant Nr:"
Set objParameterAngebot = parDruckAngebot_WH()
objParameterAngebot.mainTableName = "HT_AuftragAnkaufErz"
objParameterAngebot.subTableName = "UT_AuftragAnkaufErz_Positionen"
objParameterAngebot.fieldNameKLNo = "LieferantNr"
Hier muß ich einfach festhalten MS hat sich einiges bei VBA gedacht aber a) nicht zu Ende und b) mangelhaft an bestimmten Stellen.
Es gibt durchaus eine Menge Fans von Access. Vom Standpunkt von guter OO-Programmierung ist VBA ein Sanierungsfall. Dabei könnte es so einfach sein. VBA als Mitglied der .NET Sprachfamilie und gut wär’s. Ich verstehe nicht, warum es MS nicht macht. Die Unterstützung durch Werkzeuge ist so in den 80 er Jahren des letzten Jahrtausends hängen geblieben. Ja, man kann in VBA auch riesige Programme schreiben, es tut aber weh ….
Wo MS-Access (mit VBA) vollkommen mangelhaft ist
1) Keine integrierten Tests
2) An Objekten orientiert, aber nicht OO-mässig zu programmieren
3) Grauenhafte Benutzung in einem RCS (hier benutze ich TortoiseGit) , Problem: Groß/Kleinschreibung geht munter durcheinander, es gibt IDS, die sich einfach ändern
4) Keine Unterstützung für die Trennung von UI, Daten und dem Programm. Wie geschrieben, der Code ist heute noch typisch für Ms Access. Man bekommt halt schnell was zusammen …
5) der SQL Editor ist eine Zumutung!
Wo es glänzt
1) mal eben was zusammenstoppeln ist schnell erledigt
2) der Direktbereich, man kann während der Laufzeit anhalten und sich alles anschauen, kein rekompilieren nötig
3) preisgünstig
Es ist klar MS will, daß wir MS-SQL mit C# benutzen, es ist nicht überzeugend, daß dies für kleine Betriebe eine bessere Lösung als eine MS-Access basierte wäre.
Wünsche und Beschwerden …
Ziehe ich mal von FB rüber, womöglich mache ich da ja nicht mehr so lange mit …
Ich weiß, das Leben ist kein Wunschkonzert, aber trotzdem darf man Wünsche haben. Es gibt eine Reihe davon aus meinem Programmerleben:
– VBA als vollständiges Mitglied der .NET Familie, das Gleiche bitte auch für die WLanguage
– Ein vernünftiger Editor für VBA (ohne die MZ Tools wäre es noch schlechter) MS kann offensichtlich IDEs, warum nicht für die in Office benutzte PS? Man schaue sich mal OpenGenera an und den dort benutzen ZMACS, das ganze OS kann man in Lisp Dialekten programmieren.
– ein vernünftiges Test-Framework für Ms Access. Man versteht, warum es keine Tests gibt und alle Programme im Debugger „entwickelt“ werden.
– Vernünftige Editoren für Smalltalks (egal welches, alle sind unkomfortabel und das für so eine wunderbare Sprache wie Smalltalk
– Ein Smalltalk für die .NET Familie
– Vernünftige GUI, Report Builder oder Tools für die Behandlung von Dateien und Verzeichnissen, für Smalltalks und spezieller Pharo. Warum gibt es nicht was zumindest Gleichwertiges in diesem Bereich zu ja selbst MS Access?
– Ein wirklich nettere PS für Latex (auch wäre ein visueller Report Builder eine nette Sache) Latex läuft, ist stabil seit mehr als20 Jahren und bringt besser Sachen aufs Papier als so gut wie jedes andere Programm .
– Ein GUI-Builder, GUI-Framework, für Emacs, damit man endlich mal auch das von der manuellen Erstellung von GUIS wegkommt.
Ganz massiv stört mich diese Sachen bei Smalltalk. Wenn das in Java möglich ist, dann schon lange in Smalltalk aber nein, damit befleckt man wohl die „Reinheit“ von Smalltalk …
Und ja mich ärgert es auch speziell bei VBA, weil es da schon so
lange gibt und VB ein Meilenstein für die Entwicklung von Windows Programmen war. Was macht MS damit … Es ärgert mich noch mehr, wenn ich daran denke, worauf der Erfolg von MS basiert. Es war nicht zuletzt das Basic von denen, was MS an die Spitze brachte und dann macht man so was platt?
Bei Emacs ärgert mich etwas, daß es Emacs Lisp gibt. Warum konnte es kein Common Lisp sein? Stallmann kannte es doch …
Und nein, ein Guile-Emacs gibt es immer noch nicht ernsthaft …
Ja, ich weiß mach’s doch selber … Tja Punkt ist, brauche das nicht für C#, Java, C, C++, Delphi, FreePascal, TurboPascal, VB, Dolphin Smalltalk machen und ’ne Zillion von Libraries gibt es auch ….
Ich schweig mal höflich über den Stand von IDE für die ach-so-tollen-funktionalen-Programmiersprachen … Ausnahme vielleicht F# auf Windows, aber genau weiß ich das nicht, denn Ocaml fällt bei mir unter den gleichen „Horror“ wie C++ und Perl …
Ich bin der Meinung gute Werkzeuge sollte es auch für Programmierer geben und nein, die Anbieter von funktionalen Sprachen wie Haskell, leisten das nicht. Ernsthaft, wenn es um DBs geht und man, was für Anwender schaffen will, dann ist man mit MS Access besser bedient als mit jeder funktionalen PS.
Man verstehe vollkommen den Erfolg von Java, C# und so um Vergleich, weil diese Sachen einfach nützlicher sind. Und ja es dürfte mindestens ne Million mehr Anwender und Programmierer für MS Access geben als für alle funktionale PS zusammen …
Manch werden mich auslachen, es liegt doch nur an Dir, was Du nützlich findest. Ist das wirklich so? Bin ich da so eine Ausnahme? Die Prediger für die Nützlichkeit von anderen Programmiersprachen sitzen m.E. teilweise auf einem zu hohen Ross‘ , keine Ahnung, ob es an mir alleine liegt, ich glaube nicht. Wenn ich an die Haskell-Evangelisten denke, dann sehe ich meine Meinung bestätigt, die Common Lisper sind leider auch nicht so viel besser … Wer die „Genialität“ der Tools von denen nicht erkennt, ist wohl einfach nur ein dummy …
That really was helpful.
I struggled with some „profane“ text edit duties, but well, in
over 100 files, and as a programmer … you know what we do.
Spend 3 hours to save repeating a task a few hundred times 😉
My problem, I had to match [[SomeContent]]
And I had an assoc list
setq 'assoc-listt'(("Key-1", "Value1"
("SomeContent", "Some Link to")
I did not get the regular expression right, ChatGPT did it:
(defun my-function ()
(interactive)
(with-temp-buffer
(insert-file-contents "filename.txt")
(goto-char (point-min))
;; Search and replace
(while (re-search-forward "\\[\\[\\(.*?\\)\\]\\]" nil t)
(let* ((match (match-string 1))
(value (cdr (assoc match some-alist))))
(when value
(replace-match (format "[[file://%s][%s]]" value match) nil t nil 1))))))
Just one problem the last 1 , that lead to the non replacement of [[ and]] replace it with zero and you’re fine. With some stuff around, with some saving of buffers, did I get what I wanted.
It’s always nice if you can program your editor, and I doubt there is anything as programmable as an Emacs 😉
Thanks for the fish – ah sorry code …
Quite interesting
That so many seem to dislike C. Yes it has its shortcomings, but it’s one of the simpler languages overall, and it deserves the name „portable Assembler“. C runs everywhere, and C has built everything we are using today. Every wider used Operating System was mostly written in C. It starts with every Unix under the sun. It’s the foundation of Windows. There may be OSes out there not written in C, but I probably know just one Genera. C allows you to manipulate bits, and that’s as low as it can get.
Nearly any Database is written in C, be it the old ones, be it the new ones. There’s some kind of C compiler on every OS. It’s the lingua franca of the IT-Industry as we know it.
Let’s wait and see if if finds a descendant, there are candidates for that, one can doubt it will bet C++.
Whatever language you use, I strongly suggest you learn C too. I doubt you will never get in touch with it, and be it just to wrap some C-API for your programming language you’re currently using.
Just for the curious
and those which don’t think MS is just the evil empire per se:
https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7/
Just imagine how hard they work to get better. Yeah, they sometimes fail, but overall, they have made the PC a think everyone wants. I remind you of my critique about the dead of Visual Basic. Just imagine they have spent just a hundredth of the time they put into .NET.
It just reminds me of one thing, I think, which covers it all, see:
https://www.youtube.com/watch?v=Vhh_GeBPOhs.
VB has done more for developing more software as many other tools combined (exception might be TurboPascal) . And it’s terrible lacking in/with languages like Smalltalk, Common Lisp etc. I will never understand why one kills such a cash cow.
But they did a remarkable job with .NET, and they really spent literally Millions or even Billions on it. Anyway, I don’t know about the prices for the development environment alone because I’m buying them all at around 1500 – 1700 € / year. And so, I can use whatever I want. I know at least that VB was not in that price class, I, personally, think that dropping that was an error. Of course, I might be wrong