Privacy policy



(German-language version below)

Website privacy policy and information for those affected by Articles 13 and 14 of the EU General Data Protection Regulation

General Information

Information about the controller

Company: IBExpert Ltd
Legal representative: Holger Klemt
Address:


22 Triq Ir-Rabat
Marsalforn, Iz-Zebbug
MFN 9012
Malta
Contact: info@ibexpert.com

Specific information about the website

Newsletter

As part of the registration process for our newsletter, you will need to provide us with your e-mail address and other optional data. We will only use this information to send you the newsletter. We will store the data you provide when registering for the newsletter until you unsubscribe from our newsletter. It is possible to unsubscribe at any time via the link provided in the newsletter, or by providing us with appropriate notification. By unsubscribing you withdraw your consent to the use of your e-mail address.

Furthermore, we will only use your e-mail address, which we have obtained in connection with the sale of a product or service, exclusively for direct marketing in the form of our newsletter for similar products or services of our own company to those purchased, unless you have objected to this use. You may withdraw permission to use your e-mail address at any time without incurring any costs other than the base rate transmission costs. Your objection (and thus the cancellation of our newsletter) can be exercised by an appropriate message to our e-mail address.

Use of custom "cookies"

This website uses its own "cookies" to increase user-friendliness ("Cookies" are data records sent by the web server to the user's browser and stored there for subsequent retrieval). Our custom "cookies" do not store any personal information. You can generally prevent the use of "cookies" by setting your browser to disallow the storage of "cookies".

General data processing information

Affected data:

Personal data is only collected if you provide it to us voluntarily. No additional personal data is collected. Any processing of your personal data that goes beyond the scope of the statutory conditions will only be based on your express consent.

Processing purpose: Contract execution.
Categories of recipients: Public entities with priority legislation.
External service providers or other contractors.
Other external bodies if the data subject has given his consent or the transmission of the data is permitted by another prevailing interest.
Third country transfers: Within the scope of the contract execution, processors based outside the European Union may also be used.
Storage period: The duration of the data storage depends on the statutory storage requirements and usually constitutes a period of 10 (ten) years.

Details of other data processing methods

Specific information for the processing of customer data/prospective customer data

Data provided for the execution of contracts, software activation and usage information; if necessary, additional data for processing, if the data subject has given his explicit consent.

Processing purpose: Contract execution, as well as the activation, registration and administration of the IBExpert software registrations and, if relevant, administration of the support hotline account (balance and usage).
Categories of recipients: Public entities with priority legislation.
External service providers or other contractors.
Other external bodies if the data subject has given his consent or the transmission of the data is permitted by another prevailing interest.
Third country transfers: Within the scope of the contract execution, processors based outside the European Union may also be used.
Storage period: The duration of the data storage depends on the statutory storage requirements and usually constitutes a period of 10 (ten) years.

Specific information for the processing of supplier data

Contract execution; if necessary, additional data for processing, if the data subject has given his explicit consent.

Processing purpose: Contract fulfilment.
Categories of recipients: Public entities with priority legislation.
External service providers or other contractors.
Other external bodies if the data subject has given his consent or the transmission of the data is permitted by another prevailing interest.
Third country transfers: Within the scope of the contract execution, processors based outside the European Union may also be used.
Storage period: The duration of the data storage depends on the statutory storage requirements and usually constitutes a period of 10 (ten) years.

Specific information regarding job applications

Affected data: Application information.
Processing purpose: Implementation of the job application process.
Categories of recipients: Public entities with priority legislation.
External service providers or other contractors.
Other external bodies if the data subject has given his consent or the transmission of the data is permitted by another prevailing interest.
Third country transfers: Within the scope of the contract execution, processors based outside the European Union may also be used.
Storage period: Application data will generally be deleted within four months following notification of the decision, unless consent has been given for a longer period of data storage.

Further information and contacts

In addition, you also have the right to demand the amendment, deletion or restricted processing of data, or to exercise your right of objection to processing and the right to data portability at any time. Here you can contact us by e-mail or letter. You also have the right to contact the data protection authorities in the event of any grievances.

Update of this Privacy Policy

IBExpert Ltd reserves the right to update this privacy policy as necessary to adapt to technical developments or in connection with the offer of new services or products. The latest version can always be viewed on the website https://ibexpert.net/cms/ via the Website Privacy Policy link. 





Webseiten-Datenschutzerklärung und zugleich Information der Betroffenen gemäß Artikel 13 und Artikel 14 EU-Datenschutzgrundverordnung

Allgemeine Angaben

Angaben zur verantwortlichen Stelle

Unternehmen: IBExpert Ltd
Gesetzlicher Vertreter: Holger Klemt
Adresse:


22 Triq Ir-Rabat
Marsalforn, Iz-Zebbug
MFN 9012
Malta
Kontaktdaten: info@ibexpert.com

Spezifische Angaben zur Webseite

Einsatz eines Newsletters

Im Rahmen der Registrierung unseres Newsletters teilen Sie uns Ihre E-Mail-Adresse und optional weitere Daten mit. Diese Angaben verwenden wir ausschließlich, um Ihnen den Newsletter zuzusenden. Ihre bei der Newsletter-Anmeldung eingegebenen Daten bleiben bei uns gespeichert, bis Sie sich wieder von unserem Newsletter abmelden. Eine Abmeldung ist jederzeit über den dafür vorgesehenen Link im Newsletter oder eine entsprechende Mitteilung an uns möglich. Mit der Abmeldung widersprechen Sie der Nutzung Ihrer E-Mail-Adresse.

Ihre E-Mail-Adresse, die wir im Zusammenhang mit dem Verkauf einer Ware oder Dienstleistung erhalten, nutzen wir darüber hinaus ausschließlich für Direktwerbung in Form unseres Newsletters für eigene ähnliche Waren oder Dienstleistungen, wie die von Ihnen bestellten, sofern Sie dieser Verwendung nicht widersprochen haben. Sie können der Verwendung Ihrer E-Mail-Adresse jederzeit widersprechen, ohne dass hierfür andere als die Übermittlungskosten nach den Basistarifen entstehen. Ihr Widerspruch (und damit die Abbestellung unseres Newsletters) kann durch entsprechende Nachricht an unsere E-Mail-Adresse (siehe Impressum) ausgeübt werden.

Einsatz eigener „Cookies“

Diese Webseite verwendet eigene „Cookies“, um die Benutzerfreundlichkeit zu erhöhen („Cookies“ sind Datensätze, die vom Webserver an den Browser des Nutzers gesendet und dort für einen späteren Abruf gespeichert werden). In unseren eigenen „Cookies“ werden keinerlei personenbezogene Daten gespeichert. Sie können die Verwendung von „Cookies“ generell verhindern, wenn Sie in Ihrem Browser die Speicherung von „Cookies“ untersagen.

Allgemeine Datenverarbeitungs-Informationen

Personenbezogene Daten werden nur erhoben, wenn Sie uns diese von sich aus mitteilen. Darüber hinaus werden keine personenbezogenen Daten erhoben. Eine über die Reichweite der gesetzlichen Erlaubnistatbestände hinausgehende Verarbeitung Ihrer personenbezogenen Daten erfolgt nur auf Grundlage Ihrer ausdrücklichen Einwilligung.

Verarbeitungszweck: Vertragsdurchführung.
Kategorien von Empfängern: Öffentliche Stellen bei Vorliegen vorrangiger Rechtsvorschriften.
Externe Dienstleister oder sonstige Auftragnehmer.
Weitere externe Stellen soweit der Betroffene seine Einwilligung erteilt hat oder eine Übermittlung aus überwiegendem Interesse zulässig ist.
Drittlandtransfers: Im Rahmen der Vertragsdurchführung können auch Auftragsverarbeiter außerhalb der Europäischen Union zum Einsatz kommen.
Dauer Datenspeicherung: Die Dauer der Datenspeicherung richtet sich nach den gesetzlichen Aufbewahrungspflichten und beträgt in der Regel 10 Jahre.

Angaben zu weiteren Datenverarbeitungsverfahren

Spezifische Angaben zur Verarbeitung von Kundendaten/Interessentendaten

Zur Vertragsdurchführung mitgeteilte Daten, Lizenz- und Nutzungsinformationen; ggfs. darüber hinaus gehende Daten zur Verarbeitung auf Basis Ihrer ausdrücklichen Einwilligung.

Verarbeitungszweck: Vertragsdurchführung, sowie die Aktivierung, Registrierung und Verwaltung der IBExpert Software Registrierungen sowie ggfs. Verwaltung von Support Hotline Guthaben und Verbrauch.
Kategorien von Empfängern: Berechtigte Mitarbeiter der IBExpert GmbH
Öffentliche Stellen bei Vorliegen vorrangiger Rechtsvorschriften.
Externe Dienstleister oder sonstige Auftragnehmer.
Weitere externe Stellen soweit der Betroffene seine Einwilligung erteilt hat oder eine Übermittlung aus überwiegendem Interesse zulässig ist.
Drittlandtransfers: Im Rahmen der Vertragsdurchführung können auch Auftragsverarbeiter außerhalb der Europäischen Union zum Einsatz kommen.
Dauer Datenspeicherung: Die Dauer der Datenspeicherung richtet sich nach den gesetzlichen Aufbewahrungspflichten und beträgt in der Regel 10 Jahre.

Spezifische Angaben zur Verarbeitung von Lieferantendaten

Zur Vertragsdurchführung mitgeteilte Daten; ggfs. darüber hinaus gehende Daten zur Verarbeitung auf Basis Ihrer ausdrücklichen Einwilligung.

Verarbeitungszweck: Vertragsdurchführung.
Kategorien von Empfängern: Öffentliche Stellen bei Vorliegen vorrangiger Rechtsvorschriften.
Externe Dienstleister oder sonstige Auftragnehmer.
Weitere externe Stellen soweit der Betroffene seine Einwilligung erteilt hat oder eine Übermittlung aus überwiegendem Interesse zulässig ist.
Drittlandtransfers: Im Rahmen der Vertragsdurchführung können auch Auftragsverarbeiter außerhalb der Europäischen Union zum Einsatz kommen.
Dauer Datenspeicherung: Die Dauer der Datenspeicherung richtet sich nach den gesetzlichen Aufbewahrungspflichten und beträgt in der Regel 10 Jahre.

Spezifische Angaben zum Bewerbungsverfahren

Betroffene Daten: Bewerbungsangaben
Verarbeitungszweck: Durchführung Bewerbungsverfahren
Kategorien von Empfängern: Öffentliche Stellen bei Vorliegen vorrangiger Rechtsvorschriften.
Externe Dienstleister oder sonstige Auftragnehmer.
Weitere externe Stellen soweit der Betroffene seine Einwilligung erteilt hat oder eine Übermittlung aus überwiegendem Interesse zulässig ist.
Drittlandtransfers: Im Rahmen der Vertragsdurchführung können auch Auftragsverarbeiter außerhalb der Europäischen Union zum Einsatz kommen.
Dauer Datenspeicherung: Bewerbungsdaten werden nach Mitteilung der Entscheidung in der Regel binnen vier Monaten gelöscht, soweit nicht eine Einwilligung in eine längere Datenspeicherung vorliegt.

Weitere Informationen und Kontakte

Darüber hinaus können Sie jederzeit Ihre Ansprüche auf Berichtigung oder Löschung oder auf Einschränkung der Verarbeitung oder der Wahrnehmung Ihres Widerspruchsrechts gegen die Verarbeitung sowie das Recht auf Datenübertragbarkeit geltend machen. Hier finden Sie die Möglichkeit, uns per E-Mail oder Brief zu kontaktieren. Sie haben ferner das Recht, sich bei Beschwerden an die Datenschutz-Aufsichtsbehörde zu wenden.

Aktualisierung dieser Datenschutzerklärung

IBExpert Ltd behält sich vor, diese Datenschutzerklärung bei Bedarf zur Anpassung an technische Entwicklungen oder im Zusammenhang mit dem Angebot neuer Dienstleistungen oder Produkte zu aktualisieren. Die aktuelle Version können Sie stets auf der Internetseite https://ibexpert.net/cms/ über den Link Webseiten-Datenschutzerklärung einsehen. 




Neuer Entwickler im Team?

Sie haben einen neuen Entwickler im Team, der mit einer bestehenden Firebird-Anwendung arbeitet oder künftig damit arbeiten soll?

In unserem 3-tägigen Praxistraining vermitteln wir die wichtigsten Grundlagen für den Einstieg in bestehende Firebird-/Pascal-Projekte:

  • Firebird SQL und Datenbankentwicklung
  • Pascal-Programmierung mit Delphi und Lazarus
  • Arbeiten mit bestehenden Firebird-Anwendungen
  • Praktischer Einsatz von IBExpert
  • Moderne Entwicklungsworkflows einschließlich KI-Tools

16.–18. November 2026 | München

Das Training richtet sich an Entwickler, Junior Developer und Einsteiger, die praxisnah mit bestehenden Firebird-/Pascal-Anwendungen arbeiten möchten.

Alle Informationen, Agenda und Anmeldung: Firebird SQL und Pascal-Programmierung für die Next Generation


Firebird Write Operations

German-language version

Why the order of write operations is so important for Firebird

Holger Klemt, September 2026

(PDF Download)

The reliability of a Firebird database does not depend on Firebird alone. It is equally important that the underlying operating system and storage system execute and acknowledge write operations in the way the database expects.

Firebird is designed to write changes to storage in a defined and carefully coordinated order. In particular, when Forced Writes are enabled, Firebird ensures that critical changes have actually been written to persistent storage before subsequent operations are considered successfully completed.

Caches and additional storage layers

Modern operating systems, RAID controllers and storage systems attempt to optimize write operations for performance reasons. For example, write operations may be collected, combined or passed to the physical storage device in a different order.

This is generally useful and usually unproblematic for normal file access. For a database system, however, it is essential that so-called flush or synchronization requests are reliably passed through all layers down to the actual persistent storage medium.

Additional layers between Firebird and the physical storage device can therefore become critical, for example:

  • Host or controller caches
  • RAID and storage virtualization
  • Cluster file systems
  • Block-level replication
  • SAN or NAS systems
  • Snapshots and other virtualization layers
  • Write caches that are not protected by battery backup or flash-based protection

The problem arises in particular when one of these layers reports a write operation as completed even though the data has not yet been permanently stored.

What can happen during a crash

In the event of a power failure, kernel crash or hardware failure, write operations that have already been acknowledged may therefore be lost.

This becomes particularly problematic when a later database state has already reached the storage device while related earlier changes are still waiting in a cache. This can result in information within the database file that is no longer consistent.

Firebird’s carefully designed write strategy is intended to prevent exactly these situations. However, this requires the operating system, drivers, controllers and storage system to correctly implement the corresponding synchronization requirements.

Disabling Forced Writes may therefore significantly improve write performance, but at the same time it removes an important layer of database protection.

Linux Is not automatically protected against these problems

Linux file systems such as ext4 provide mechanisms for controlling the order and durability of write operations. However, this does not automatically mean that every underlying storage configuration provides the same guarantees.

As soon as additional cluster, mirroring, RAID or virtualization layers are involved, it must be ensured that flush operations and write barriers are actually passed through to persistent storage.

For database systems, the more important question is therefore not whether Windows or Linux is being used, but whether the entire storage stack reliably provides the guarantees required by the database system.

A real-world example

Several years ago, a serious failure occurred in a business-critical Firebird environment managed by us. The database was hosted on an externally implemented Linux cluster and storage solution.

Following an error, not only the production database but also the copy created at storage level was affected. Restoring the system required extensive analysis and repair work.

The architecture was subsequently changed. Since then, redundancy has no longer been provided through transparent mirroring of an open database file, but through replication at the Firebird database level to independent server systems. This architecture has been operating reliably in that environment for many years.

Redundancy should ideally be implemented at database level

For Firebird systems, we therefore prefer storage architectures that are as simple and transparent as possible.

Where possible, redundancy and high availability should be implemented in such a way that two independently operating Firebird servers each maintain their own local database file, with synchronization being controlled at the database level.

This approach offers several advantages:

  • Each Firebird server controls its own database file.
  • Storage problems affecting one system are not automatically transferred to the second database file.
  • The number of additional caching and virtualization layers is reduced.
  • Problems are easier to analyze and isolate.
  • Firebird's write mechanisms, which are essential for data integrity, remain intact.

Security and performance are not mutually exclusive

Strictly maintaining the required order of write operations inevitably introduces a certain amount of latency. In applications with very intensive write activity, this latency can be clearly measurable.

However, this additional latency is not unnecessary performance loss. It is an essential component of transaction safety.

When optimizing a Firebird server, the goal should therefore not be to circumvent these safety mechanisms. A better approach is to design the hardware and storage architecture in such a way that synchronous write operations can be completed as quickly as possible.

A fast database requires fast storage. A reliable database, however, requires storage whose claims regarding successfully stored data actually hold true.


Training

(German-language version below)

3-day practical training course

Firebird SQL and Pascal programming for the next generation

From basic developer knowledge to productive involvement in real-world Delphi, Lazarus, Firebird and IBExpert projects.

 - 16 -18 November 2026 – Munich – 3 days, 9.00 am–5.00 pm – German language - 

This 3-day hands-on training course can also be booked as a remote or on-site in-house training course.


The focus of this course

Practical knowledge for getting started with established software projects

Basic programming skills are often not enough to start working productively on an existing enterprise application straight away. Project files, units, forms, components, packages, events, database access and SQL objects must be understood as an integrated system.

This training course provides precisely this orientation and practical knowledge. Participants will build a small application using Lazarus, create the associated Firebird database and programme the connection between the two using IBExpert.

“The best programming language at the moment is German.”
It is crucial to formulate requirements in full and to carry out a technical review of the results produced.


Target group

For the next generation of developers

Not a retrospective look at old development environments, but a practical introduction for people who will be working productively on existing systems in the future. No practical experience with Delphi, Lazarus, Firebird or IBExpert is required.

Suitable for

  • Apprentices, students and those starting their careers with basic programming skills
  • People changing careers who will be working on Delphi, Lazarus or Firebird projects in future
  • Junior developers with no practical experience of larger, established applications
  • Companies wishing to integrate junior staff into existing projects more quickly and in a more structured manner

Recommended Requirements

  • A basic understanding of variables, conditions, loops and simple programme flows
  • Bringing your own Windows laptop is recommended; detailed software requirements will be provided prior to the course
  • A willingness not only to generate source code and SQL, but also to read and check it systematically

Course objectives

What participants should be able to accomplish after three days

  • find their way around an existing Delphi or Lazarus project
  • read and write basic Object Pascal code
  • build a simple graphical or console-based application
  • understand the structure of a Firebird database
  • create and analyse SQL and PSQL code using IBExpert
  • connect a Lazarus application to a Firebird database
  • take on small, clearly defined tasks within an existing project
  • critically review AI-generated code and reuse it appropriately

 Benefits for employers

  • faster induction of new staff into existing projects
  • a shared basic understanding of the application, database and development tools
  • less uncontrolled copy-and-paste code from AI systems
  • better modularity and more clearly defined tasks for junior developers
  • practical preparation for real-world maintenance, extension and analysis tasks

Key information

The event at a glance

Date: 16–18 November 2026
Location: Munich
Duration: 3 days, 9.00 am – 5.00 pm
Language: German


Understanding the Pascal world
Project structure, language, components, events and launching your own Lazarus application.

Day 2

Firebird SQL, PSQL and IBExpert
Data model, SQL, database programming and connecting the application to Firebird.

Day 3

Interaction, modularity and AI
Clean application structure, practical AI support and verifying generated results.


Training programme

Three days focusing on a single, continuous practical project

Participants do not learn about the individual components in isolation, but instead combine Pascal code, the user interface, the Firebird database and IBExpert step by step to create a small, fully functional application.

The ongoing practical project: a time and attendance system

Over the course of the three training days, a practical time and attendance system will be developed step by step:

  • Day 1: Development of a basic Lazarus GUI for recording arrival and departure times. Initially, the data is deliberately stored in plain text files.
  • Day 2: Transferring the recorded data into a newly created Firebird database. This involves creating tables, SQL queries and triggers. The triggers also transfer the relevant information to existing tables within an existing software solution.
  • Day 3: 
  • Conversion of the Lazarus application into a minimal PHP-based terminal application that writes directly to Firebird, with AI support. This can be used in kiosk mode on iPads and later operated via NFC cards.

In this way, participants learn, through a coherent example, the journey from a simple local prototype, through database integration, to a modular, cross-platform application.

    Day 1

    Understanding the Pascal World

    Project structure, the language, components, events and launching your own Lazarus application.

    Morning: How is a Delphi or Lazarus project constructed?

    Project orientation

    • What are Pascal, Object Pascal, Delphi and Lazarus?
    • Similarities and differences between Delphi and Lazarus
    • Project structure
    • Meaning of typical file formats: .dpr, .lpr, .pas, .dfm and .lfm
    • Other project, resource and configuration files
    • What happens during compilation?
    • From source code to executable file
    • Understanding compiler errors, warnings and notes

    Basic structure of a Pascal unit

    • unit, program and library
    • interface and implementation
    • uses and dependencies
    • Declaration and visibility
    • Local and global elements
    • Initialisation and finalisation
    • Namespaces and name conflicts

    Afternoon: Language, Components and Events

    Basic language elements

    • Constants and variables
    • Data types
    • Enumerations, sets and records
    • Arrays, lists and strings
    • Procedures and functions
    • Parameters and return values
    • Scopes
    • Classes, objects, methods and properties
    • Creating and releasing objects
    • Basic error handling with exceptions

    Graphical applications

    • Forms and controls
    • Properties, methods and events
    • Visual and non-visual components
    • Event handling, for example OnClick, OnCreate and OnClose
    • Relationship between the form and its associated unit
    • Packages and reusable components
    • Difference between GUI and console applications

    Practical project

    • Creating a new Lazarus project
    • Designing the main form
    • Adding input fields and buttons
    • Implementing events
    • Checking and processing data
    • Extracting the first functions into separate units

    Today's outcome: Participants will be able to explain the structure of a Pascal project, read basic Object Pascal code and create a small application with their own events, procedures and functions.


    Day 2

    Firebird SQL, PSQL and IBExpert

    Data model, SQL, database programming and connecting the application to Firebird.

    Morning: Structure and language of a Firebird database

    Fundamentals of relational databases

    • Tables, records, columns and data types
    • The difference between data and metadata
    • Primary keys and foreign keys
    • Relationships between tables
    • NULL and its special characteristics
    • Domains, sequences and generators
    • Constraints and indexes
    • Views as stored perspectives on data

    SQL basics

    • DDL: CREATE, ALTER, DROP, RECREATE and CREATE OR ALTER
    • DML: SELECT, INSERT, UPDATE and DELETE
    • Conditions using WHERE
    • Sorting using ORDER BY
    • Grouping and aggregate functions
    • Joins using JOIN
    • Parameters instead of compound SQL strings
    • Transactions, COMMIT and ROLLBACK

    Afternoon: Programming in the database

    Firebird PSQL

    • Structure of a PSQL module
    • Variables and parameters
    • BEGIN and END
    • Conditions and loops
    • Stored procedures and stored functions
    • Triggers and exceptions
    • Executable and selectable procedures
    • Demarcation: What belongs in the database and what belongs in the application?

    Working with IBExpert

    • Registering and opening a database
    • Navigating the Database Explorer
    • Editing tables and other metadata objects
    • Using the SQL Editor
    • Executing queries and checking results
    • Creating SQL scripts
    • Identifying dependencies between objects
    • Testing procedures and triggers
    • Locating errors and interpreting error messages correctly

    Connection to the Lazarus application

    • Establishing a database connection
    • Connection, Transaction and Query components
    • Executing SQL queries from the application
    • Passing parameters
    • Reading, inserting and modifying data
    • Committing transactions correctly
    • Handling database errors in the application

    Expanding the practical project

    • Creating a Firebird database for the example application
    • Defining tables and relationships
    • Storing, displaying, modifying and deleting records
    • Implementing simple business rules

    Today's outcome: Participants will understand the basic structure of a Firebird database, be able to create simple SQL and PSQL objects, and connect a Lazarus application to the database.


    Day 3

    Interaction, modularity and AI

    A clear application structure, practical AI support and the verification of generated results.

    Morning: Creating an application from individual components

    Structure of a database-driven application

    • User interface, programme logic, database access and database logic
    • Clearly separating responsibilities
    • Why the entire code should not be contained within a single form
    • Dedicated units for distinct tasks
    • Reusable functions and classes
    • Centralised error handling and logging
    • Configuration rather than hard-coded values

    Modularity in practice

    • Small, clearly defined modules
    • Unambiguous inputs and outputs
    • As few hidden dependencies as possible
    • Descriptive names and traceable structures
    • Limit changes to a restricted area
    • Extend existing code without unintentionally altering other behaviour
    • The difference between ‘works for now’ and ‘is maintainable’

    GUI and console applications

    • when a graphical user interface is appropriate
    • when a console programme is the better solution
    • Automation of routine tasks
    • Shared business logic for different types of programme
    • Separation of the user interface from the actual processing

    Afternoon: AI as a Development Tool

    The best programming language is German

    • Describe the goal, starting point, and framework
    • List the versions and technologies used
    • Clearly define inputs and outputs
    • Take special cases and error cases into account
    • Provide existing code in its entirety and without modification
    • Specify concrete rules for changes
    • Break down large tasks into verifiable sub-steps

    Useful Applications of AI

    • Explain existing code and analyze unknown units
    • Prepare routine code and SQL queries
    • Generate test data and test cases
    • Analyze error messages
    • Document and modularize code
    • Compare variants

    Limitations and Risks

    • Code that sounds plausible but is incorrect
    • Fictitious functions, classes, or components
    • Solutions that do not match the version in use
    • Missing error handling and insecure SQL constructs
    • Resource and memory issues
    • Unintended changes to existing behavior
    • Disclosure of confidential data or source code
    • Adoption of code that no one on the team can explain

    Functional testing of AI results

    • Does the code actually fulfil the requirements?
    • Can it be compiled with the intended version?
    • Are all the functions used actually available?
    • Are error cases handled?
    • Do transactions and resources remain in a defined state?
    • Is the code understandable and modular?
    • Can components be tested independently?
    • Have existing functions been unintentionally altered?
    • Do SQL statements match the data model?

    Final project

    • Display existing data
    • Create and modify new records
    • Validate inputs and handle database errors
    • Extract programme logic into separate modules
    • Prepare a small additional function using AI
    • Jointly analyse and correct the generated code

    Today's outcome: Participants will understand the interplay between the user interface, Pascal code, database access and the Firebird database. They will be able to use AI tools as a support without relinquishing responsibility for functionality, security and maintainability to the AI.


    AI in Development

    Accelerating progress without relinquishing control

    ChatGPT, Codex and similar tools can explain source code, prepare routines, generate SQL, develop test cases and assist with debugging. However, they are no substitute for technical understanding or systematic testing. This training course therefore not only demonstrates how AI is used, but above all how requirements are formulated, results are broken down, compiled, tested and examined for unintended side effects.

    Why modularity is becoming increasingly important

    Small, clearly defined, and independently testable modules can be developed more reliably with AI support than large, complex blocks of source code.

    • clear inputs and outputs
    • few hidden dependencies
    • limited scope of changes
    • individually testable functions
    • transparent responsibilities

    After the Course

    Participants will be able to contribute practically rather than just knowing the basics

    • Identify the most important project components
    • Understand the basic program flow
    • Make simple changes to forms and units
    • Read and create SQL queries
    • Examine database objects using IBExpert
    • Implement small functions on your own
    • Systematically narrow down errors
    • Work on clearly defined tasks with the support of AI
    • Critically test the generated results
    • Contribute effectively to an experienced development team

    Interested in the course?

    Training Course: Firebird SQL and Pascal Programming for the Next Generation
    Date: November 16 -18, 2026, 9.00 am–5.00 pm
    Price per participant: 1,490.00 EUR (plus VAT)
    For the second and subsequent participants billed to the same invoice recipient: 1,290.00 EUR per participant (plus VAT)
    Venue: TBK Patent Attorneys, Bavariaring 4–6, 80336 Munich, Germany
    Contact and registration via email: register@ibexpert.net

    This 3-day hands-on training course can also be booked as a remote or on-site in-house training session, in which we will use your existing software and database as a basis.


    (English-language version above)

    3-tägige Praxisschulung

    Firebird SQL und Pascalprogrammierung für die Next Generation

    Vom grundlegenden Entwicklerwissen zur produktiven Mitarbeit in realen Delphi-, Lazarus-, Firebird- und IBExpert-Projekten.

     - 16.-18. November 2026 - München - 3 Tage 9.00-17.00 Uhr - Deutsch - 

    Diese 3-tägige Praxisschulung kann auch als Remote- oder Onsite-Firmenschulung gebucht werden.


    Worum es geht

    Praxiswissen für den Einstieg in gewachsene Softwareprojekte

    Grundlegende Programmierkenntnisse reichen oft nicht aus, um in einer bestehenden Unternehmensanwendung sofort produktiv mitzuarbeiten. Projektdateien, Units, Formulare, Komponenten, Packages, Ereignisse, Datenbankzugriffe und SQL-Objekte müssen als zusammenhängendes System verstanden werden.

    Diese Schulung vermittelt genau dieses Orientierungs- und Praxiswissen. Die Teilnehmer bauen mit Lazarus eine kleine Anwendung auf, erstellen die zugehörige Firebird-Datenbank und programmieren die Verbindung zwischen beiden Welten mit Unterstützung von IBExpert.

    „Die beste Programmiersprache ist aktuell Deutsch.“
    Entscheidend ist, Anforderungen vollständig zu formulieren und die erzeugten Ergebnisse fachlich zu prüfen.


    Zielgruppe

    Für die nächste Entwicklergeneration

    Nicht als Rückblick auf alte Entwicklungswelten, sondern als praxisnaher Einstieg für Menschen, die künftig produktiv an bestehenden Systemen mitarbeiten sollen. Keine praktische Erfahrung mit Delphi, Lazarus, Firebird oder IBExpert erforderlich.

    Geeignet für

    • Auszubildende, Studierende und Berufseinsteiger mit grundlegenden Programmierkenntnissen
    • Quereinsteiger, die künftig an Delphi-, Lazarus- oder Firebird-Projekten mitarbeiten sollen
    • Junior-Entwickler ohne praktische Erfahrung in größeren, gewachsenen Anwendungen
    • Unternehmen, die Nachwuchskräfte schneller und strukturierter in bestehende Projekte einarbeiten möchten

    Empfohlene Voraussetzungen

    • Grundverständnis für Variablen, Bedingungen, Schleifen und einfache Programmabläufe
    • eigener Windows-Notebook-PC empfohlen; genaue Software-Vorbereitung folgt vor der Schulung
    • Bereitschaft, Quellcode und SQL nicht nur zu erzeugen, sondern systematisch zu lesen und zu prüfen

    Lernziele

    Was die Teilnehmer nach drei Tagen können sollen

    • sich in einem bestehenden Delphi- oder Lazarus-Projekt orientieren
    • grundlegenden Object-Pascal-Code lesen und selbst erstellen
    • eine einfache grafische oder konsolenbasierte Anwendung aufbauen
    • die Struktur einer Firebird-Datenbank verstehen
    • SQL- und PSQL-Code mit IBExpert erstellen und analysieren
    • eine Lazarus-Anwendung mit einer Firebird-Datenbank verbinden
    • kleinere, klar abgegrenzte Aufgaben in einem bestehenden Projekt übernehmen
    • KI-generierten Code kritisch prüfen und sinnvoll weiterverwenden

     Nutzen für Arbeitgeber

    • schnellere Orientierung neuer Mitarbeiter in bestehenden Projekten
    • ein gemeinsames Grundverständnis für Anwendung, Datenbank und Entwicklungswerkzeuge
    • weniger unkontrollierter Copy-and-paste-Code aus KI-Systemen
    •  bessere Modularität und klarer abgegrenzte Aufgaben für Junior-Entwickler
    • praxisnahe Vorbereitung auf reale Wartungs-, Erweiterungs- und Analyseaufgaben

    Rahmendaten

    Die Veranstaltung auf einen Blick

    Termin 16.-18. November 2026
    Ort München 
    Dauer 3 Tage von 9.00 - 17.00 Uhr
    Sprache Deutsch

    Tag 1
    Die Pascal-Welt verstehen
    Projektaufbau, Sprache, Komponenten, Ereignisse und der Start einer eigenen Lazarus-Anwendung.

    Tag 2
    Firebird SQL, PSQL und IBExpert
    Datenmodell, SQL, Datenbankprogrammierung und die Verbindung der Anwendung mit Firebird.

    Tag 3
    Zusammenspiel, Modularität und KI
    Saubere Anwendungsstruktur, sinnvolle KI-Unterstützung und die Prüfung generierter Ergebnisse.


    Schulungsprogramm

    Drei Tage mit einem durchgehenden Praxisprojekt

    Die Teilnehmer lernen die Einzelteile nicht isoliert kennen, sondern verbinden Pascal-Code, Benutzeroberfläche, Firebird-Datenbank und IBExpert Schritt für Schritt zu einer kleinen, funktionsfähigen Anwendung.

    Das durchgehende Praxisprojekt: eine Arbeitszeiterfassung

    Über alle drei Schulungstage entsteht schrittweise eine praxisnahe Arbeitszeiterfassung:

    • Tag 1: Entwicklung einer minimalen Lazarus-GUI zur Erfassung von Kommen- und Gehen-Zeiten. Die Daten werden zunächst bewusst einfach in Textdateien gespeichert.
    • Tag 2: Übernahme der erfassten Daten in eine neu aufgebaute Firebird-Datenbank. Dabei werden Tabellen, SQL-Abfragen und Trigger erstellt. Die Trigger übertragen die relevanten Informationen zusätzlich in bereits vorhandene Tabellen einer bestehenden Softwarelösung.
    • Tag 3: Übertragung der Lazarus-Anwendung in eine minimale PHP-basierte Terminalanwendung, de direkt in Firebird schreibt, mit Unterstützung von KI. Diese kann im Kioskmodus auf iPads eingesetzt und später über NFC-Karten bedient werden.

    So lernen die Teilnehmer an einem zusammenhängenden Beispiel den Weg vom einfachen lokalen Prototyp über die Datenbankintegration bis zur modularen, plattformübergreifenden Anwendung kennen.

    Tag 1

    Die Pascal-Welt verstehen

    Projektaufbau, Sprache, Komponenten, Ereignisse und der Start einer eigenen Lazarus-Anwendung.

    Vormittag: Wie ist ein Delphi- oder Lazarus-Projekt aufgebaut?

    Orientierung im Projekt

    • Was ist Pascal, Object Pascal, Delphi und Lazarus?
    • Gemeinsamkeiten und Unterschiede zwischen Delphi und Lazarus
    • Aufbau eines Projekts
    • Bedeutung typischer Dateiformate: .dpr, .lpr, .pas, .dfm und .lfm
    • weitere Projekt-, Ressourcen- und Konfigurationsdateien
    • Was passiert beim Kompilieren?
    • Vom Quellcode zur ausführbaren Datei
    • Compilerfehler, Warnungen und Hinweise verstehen

    Grundstruktur einer Pascal-Unit

    • unit, program und library
    • interface und implementation
    • uses und Abhängigkeiten
    • Deklaration und Sichtbarkeit
    • lokale und globale Elemente
    • Initialisierung und Finalisierung
    • Namensräume und Namenskonflikte

    Nachmittag: Sprache, Komponenten und Ereignisse

    Grundlegende Sprachelemente

    • Konstanten und Variablen
    • Datentypen
    • Aufzählungen, Mengen und Records
    • Arrays, Listen und Strings
    • Prozeduren und Funktionen
    • Parameter und Rückgabewerte
    • Gültigkeitsbereiche
    • Klassen, Objekte, Methoden und Eigenschaften
    • Erzeugen und Freigeben von Objekten
    • grundlegende Fehlerbehandlung mit Exceptions

    Grafische Anwendungen

    • Formulare und Steuerelemente
    • Eigenschaften, Methoden und Ereignisse
    • visuelle und nicht visuelle Komponenten
    • Ereignisbehandlung, zum Beispiel OnClick, OnCreate und OnClose
    • Zusammenhang zwischen Formular und zugehöriger Unit
    • Packages und wiederverwendbare Komponenten
    • Unterschied zwischen GUI- und Konsolenanwendung

    Praxisprojekt

    • neues Lazarus-Projekt anlegen
    • Hauptformular gestalten
    • Eingabefelder und Schaltflächen hinzufügen
    • Ereignisse implementieren
    • Daten prüfen und verarbeiten
    • erste Funktionen in eigene Units auslagern

    Ergebnis des Tages: Die Teilnehmer können den Aufbau eines Pascal-Projekts erklären, grundlegenden Object-Pascal-Code lesen und eine kleine Anwendung mit eigenen Ereignissen, Prozeduren und Funktionen erstellen.


    Tag 2

    Firebird SQL, PSQL und IBExpert

    Datenmodell, SQL, Datenbankprogrammierung und die Verbindung der Anwendung mit Firebird.

    Vormittag: Aufbau und Sprache einer Firebird-Datenbank

    Grundlagen relationaler Datenbanken

    • Tabellen, Datensätze, Spalten und Datentypen
    • Unterschied zwischen Daten und Metadaten
    • Primärschlüssel und Fremdschlüssel
    • Beziehungen zwischen Tabellen
    • NULL und seine Besonderheiten
    • Domains, Sequences beziehungsweise Generatoren
    • Constraints und Indizes
    • Views als gespeicherte Sicht auf Daten

    SQL-Grundlagen

    • DDL: CREATE, ALTER, DROP, RECREATE und CREATE OR ALTER
    • DML: SELECT, INSERT, UPDATE und DELETE
    • Bedingungen mit WHERE
    • Sortierung mit ORDER BY
    • Gruppierung und Aggregatfunktionen
    • Verknüpfungen mit JOIN
    • Parameter statt zusammengesetzter SQL-Strings
    • Transaktionen, COMMIT und ROLLBACK

    Nachmittag: Programmierung in der Datenbank

    Firebird PSQL

    • Aufbau eines PSQL-Moduls
    • Variablen und Parameter
    • BEGIN und END
    • Bedingungen und Schleifen
    • Stored Procedures und Stored Functions
    • Trigger und Exceptions
    • ausführbare und auswählbare Prozeduren
    • Abgrenzung: Was gehört in die Datenbank und was in die Anwendung?

    Arbeiten mit IBExpert

    • Datenbank registrieren und öffnen
    • Orientierung im Database Explorer
    • Tabellen und andere Metadatenobjekte bearbeiten
    • SQL Editor verwenden
    • Abfragen ausführen und Ergebnisse kontrollieren
    • SQL-Skripte erstellen
    • Abhängigkeiten zwischen Objekten erkennen
    • Prozeduren und Trigger testen
    • Fehler lokalisieren und Meldungen richtig lesen

    Verbindung zur Lazarus-Anwendung

    • Datenbankverbindung aufbauen
    • Connection-, Transaction- und Query-Komponenten
    • SQL-Abfragen aus der Anwendung ausführen
    • Parameter übergeben
    • Daten lesen, einfügen und verändern
    • Transaktionen korrekt abschließen
    • Datenbankfehler in der Anwendung behandeln

    Erweiterung des Praxisprojekts

    • Firebird-Datenbank für die Beispielanwendung erstellen
    • Tabellen und Beziehungen definieren
    • Datensätze speichern, anzeigen, verändern und löschen
    • einfache fachliche Regeln umsetzen

    Ergebnis des Tages: Die Teilnehmer verstehen die Grundstruktur einer Firebird-Datenbank, können einfache SQL- und PSQL-Objekte erstellen und eine Lazarus-Anwendung mit der Datenbank verbinden.


    Tag 3

    Zusammenspiel, Modularität und KI

    Saubere Anwendungsstruktur, sinnvolle KI-Unterstützung und die Prüfung generierter Ergebnisse.

    Vormittag: Aus Einzelteilen wird eine Anwendung

    Struktur einer datenbankgestützten Anwendung

    • Benutzeroberfläche, Programmlogik, Datenbankzugriff und Datenbanklogik
    • Verantwortlichkeiten klar voneinander trennen
    • warum nicht der gesamte Code in ein Formular gehört
    • eigene Units für abgegrenzte Aufgaben
    • wiederverwendbare Funktionen und Klassen
    • zentrale Fehlerbehandlung und Logging
    • Konfiguration statt fest eingebauter Werte

    Modularität in der Praxis

    • kleine, klar definierte Module
    • eindeutige Ein- und Ausgaben
    • möglichst wenige versteckte Abhängigkeiten
    • sprechende Namen und nachvollziehbare Strukturen
    • Änderungen auf einen begrenzten Bereich beschränken
    • bestehenden Code erweitern, ohne anderes Verhalten unbeabsichtigt zu verändern
    • Unterschied zwischen „funktioniert gerade“ und „ist wartbar“

    GUI- und Konsolenanwendungen

    • wann eine grafische Oberfläche sinnvoll ist
    • wann ein Konsolenprogramm die bessere Lösung ist
    • Automatisierung von Routineaufgaben
    • gemeinsame Fachlogik für unterschiedliche Programmarten
    • Trennung von Bedienoberfläche und eigentlicher Verarbeitung

    Nachmittag: KI als Entwicklungswerkzeug

    Die beste Programmiersprache ist Deutsch

    • Ziel, Ausgangslage und Rahmenbedingungen beschreiben
    • verwendete Versionen und Technologien nennen
    • Ein- und Ausgaben eindeutig festlegen
    • Sonderfälle und Fehlerfälle berücksichtigen
    • vorhandenen Code vollständig und unverändert bereitstellen
    • konkrete Regeln für Änderungen vorgeben
    • große Aufgaben in überprüfbare Teilschritte zerlegen

    Sinnvolle Einsatzbereiche von KI

    • bestehenden Code erklären und unbekannte Units erschließen
    • Routinecode und SQL-Abfragen vorbereiten
    • Testdaten und Testfälle erzeugen
    • Fehlermeldungen analysieren
    • Code dokumentieren und modularisieren
    • Varianten vergleichen

    Grenzen und Gefahren

    • plausibel klingender, aber falscher Code
    • erfundene Funktionen, Klassen oder Komponenten
    • nicht zur eingesetzten Version passende Lösungen
    • fehlende Fehlerbehandlung und unsichere SQL-Konstruktionen
    • Ressourcen- und Speicherprobleme
    • unbeabsichtigte Änderungen an bestehendem Verhalten
    • Preisgabe vertraulicher Daten oder Quelltexte
    • Übernahme von Code, den niemand im Team erklären kann

    KI-Ergebnisse funktional prüfen

    • Erfüllt der Code wirklich die Aufgabenstellung?
    • Lässt er sich mit der vorgesehenen Version kompilieren?
    • Sind alle verwendeten Funktionen tatsächlich verfügbar?
    • Werden Fehlerfälle behandelt?
    • Bleiben Transaktionen und Ressourcen in einem definierten Zustand?
    • Ist der Code verständlich und modular?
    • Können Bestandteile unabhängig getestet werden?
    • Wurden bestehende Funktionen unbeabsichtigt verändert?
    • Stimmen SQL-Anweisungen mit dem Datenmodell überein?

    Abschlussprojekt

    • bestehende Daten anzeigen
    • neue Datensätze erfassen und verändern
    • Eingaben validieren und Datenbankfehler behandeln
    • Programmlogik in eigene Module auslagern
    • eine kleine Zusatzfunktion mithilfe einer KI vorbereiten
    • den generierten Code gemeinsam analysieren und korrigieren

    Ergebnis des Tages: Die Teilnehmer verstehen das Zusammenspiel von Benutzeroberfläche, Pascal-Code, Datenbankzugriff und Firebird-Datenbank. Sie können KI-Werkzeuge als Unterstützung einsetzen, ohne die Verantwortung für Funktion, Sicherheit und Wartbarkeit an die KI abzugeben.


    KI in der Entwicklung

    Beschleunigen, ohne die Kontrolle abzugeben

    ChatGPT, Codex und ähnliche Werkzeuge können Quellcode erklären, Routinen vorbereiten, SQL erzeugen, Testfälle entwickeln und bei der Fehlersuche helfen. Sie ersetzen jedoch weder fachliches Verständnis noch systematische Prüfung.Die Schulung zeigt deshalb nicht nur, wie KI eingesetzt wird, sondern vor allem, wie Anforderungen formuliert, Ergebnisse zerlegt, kompiliert, getestet und auf unbeabsichtigte Nebenwirkungen untersucht werden.

    Warum Modularität wichtiger wird

    Kleine, klar definierte und unabhängig prüfbare Module lassen sich zuverlässiger mit KI-Unterstützung entwickeln als große, unübersichtliche Quellcodeblöcke.

    • klare Ein- und Ausgaben
    • wenige versteckte Abhängigkeiten
    • begrenzte Änderungsbereiche
    • einzeln testbare Funktionen
    • nachvollziehbare Verantwortlichkeiten

    Nach der Schulung

    Praxisfähig mitarbeiten statt nur Grundlagen kennen

    • die wichtigsten Projektbestandteile identifizieren
    • den grundsätzlichen Programmablauf nachvollziehen
    • einfache Änderungen an Formularen und Units durchführen
    • SQL-Abfragen lesen und erstellen
    • Datenbankobjekte mit IBExpert untersuchen
    • kleine Funktionen selbst implementieren
    • Fehler systematisch eingrenzen
    • klar definierte Aufgaben mit Unterstützung einer KI bearbeiten
    • die erzeugten Ergebnisse kritisch testen
    • sinnvoll in einem erfahrenen Entwicklungsteam mitarbeiten

    Interesse an der Schulung?

    Schulung: Firebird SQL und Pascalprogrammierung für die Next Generation
    Zeitraum: 16.-18. November 2026, 9.00 - 17.00 Uhr
    Preis pro Teilnehmer: Preis pro Teilnehmer: 1.490,00 EUR (zzgl. MwSt.)
    Ab dem 2. Teilnehmer bei demselben Rechnungsempfänger: 1.290,00 EUR pro Teilnehmer (zzgl. MwSt.)

    Veranstaltungsort: TBK Patentanwälte, Bavariaring 4-6, 80336 München
    Kontakt und Anmeldung per E-Mail: register@ibexpert.net

    Diese 3-tägige Praxisschulung kann auch als Remote- oder Onsite-Firmenschulung, in der wir dann Ihre schon existierende Software und Datenbank als Basis nehmen, gebucht werden.



    From UDF to UDR in Firebird 5

    Soundex, Cologne Phonetics, PSQL, Free Pascal and Visual C++ in a practical benchmark

    IBExpert Ltd - Technical White Paper

    Executive Summary

    Firebird applications have been able to extend the database engine with external functions for many years. Older installations commonly used UDFs (User Defined Functions). Modern Firebird versions provide UDRs (User Defined Routines), a substantially better integrated architecture.

    This white paper follows the transition from UDF to UDR through a practical example: phonetic name matching using Soundex, a German-adapted Soundex variant, Cologne Phonetics, and distance and similarity functions. The same functionality was implemented as Firebird PSQL stored functions, a native Lazarus/Free Pascal UDR, and a native Microsoft Visual C++ 2022 UDR.

    The most surprising finding was that programming language was not the dominant performance factor. Once Free Pascal and C++ used a comparable low-level strategy, optimized FPC was typically only about 10 to 25 percent behind Visual C++.

    1. From UDF to UDR

    UDFs were a proven way to move calculations into external DLLs or shared libraries across many Firebird generations. The old UDF interface, however, belongs to an earlier generation of API design.

    UDRs are the modern successor. SQL still calls native code, but integration uses Firebird's modern plugin and object-oriented API, with cleaner handling of data types, NULL values, metadata, character sets and routine lifecycle. For new Firebird 5 extensions, UDR should therefore be regarded as the natural replacement for classic UDFs.

    2. Alternative: PSQL stored functions

    Many algorithms can be implemented entirely as Firebird PSQL stored functions. This greatly simplifies deployment: no extra DLL, no Linux shared library and no platform-specific binary.

    PSQL is particularly attractive when easy installation, backup/restore and platform independence matter more than maximum computational throughput. The real question is not whether PSQL can solve the problem, but whether it is fast enough for the expected call volume.

    3. Why phonetic name matching?

    Exact string comparisons are often insufficient for names. Klemt, Klemmt, Klempt and Klemp are technically four different strings, but may all be relevant when searching for the same person.

    Phonetic algorithms map names to codes that reflect pronunciation more than exact spelling, making typing errors, historical spellings and variants easier to detect.

    4. Soundex

    Soundex normally creates a short code consisting of an initial letter and digits representing similar consonant groups. It is simple and fast, but was primarily designed for English names.

    Our project therefore implemented SOUNDEX and SOUNDEX_DE. The German variant additionally normalizes forms such as Ä/AE, Ö/OE, Ü/UE, ß/SS and common letter combinations.

    5. Cologne Phonetics

    Cologne Phonetics is often more appropriate for German names. It uses context-sensitive rules and produces a variable-length digit sequence.

    Klemt → 4562, Klemmt → 4562, Klempt → 45612, Klemp → 4561. Klemt and Klemmt become phonetically identical, while the other variants remain very close.

    6. Distance and similarity

    COLOGNE_DISTANCE first calculates Cologne Phonetics for both names and then the Levenshtein distance between the codes. A distance of 0 means identical; 1 means one insertion, deletion or replacement is required.

    PHONETIC_SIMILARITY converts this into an easier-to-use value from 0 to 100. In our example Klemt/Klemmt returns 100, Klemt/Klempt 80 and Klemt/Klemp 75.

    7. Three implementations, identical results

    The five functions SOUNDEX, SOUNDEX_DE, COLOGNE_PHONETIC, COLOGNE_DISTANCE and PHONETIC_SIMILARITY were implemented in PSQL, as a Lazarus/FPC UDR, and as a Visual C++ UDR.

    Before performance testing, 10,000 test rows were checked. The final versions produced zero mismatches for all five functions. Identical checksums also confirmed that the implementations processed the same results.

    8. PSQL versus native UDR

    PSQL proved surprisingly practical for the simpler phonetic functions. As computational work increases, the native UDR advantage becomes much larger, especially for distance and similarity calculations.

    Function

    Native UDR (typical)

    PSQL (typical)

    Interpretation

    SOUNDEX

    ~0.04 s

    ~0.8 s

    Native clearly faster

    SOUNDEX_DE

    ~0.05 s

    ~0.9 s

    Native clearly faster

    COLOGNE_PHONETIC

    ~0.04 s

    ~1.6 s

    Native clearly faster

    COLOGNE_DISTANCE

    ~0.06 s

    ~4.5 s

    Native substantially faster

    PHONETIC_SIMILARITY

    ~0.06 s

    ~6.5 s

    Native substantially faster

    The absolute values come from different benchmark forms and should not be interpreted as a pure microbenchmark ratio. The important point is that PSQL is functional and quite capable for simpler tasks, while native UDRs scale much better as procedural computation increases.

    9. The first C++ versus Pascal comparison

    The first FPC version used convenient UnicodeString processing, UnicodeUpperCase and general string operations. The C++ implementation worked largely on UTF-8 bytes directly. C++ therefore initially appeared four to five times faster in some tests.

    This was not a fair compiler-only comparison: the implementations were doing different amounts of internal work.

    10. Making the comparison fair

    The FPC version was rewritten to use the same low-level strategy: UTF-8 remains byte-oriented in the hot path, German special characters are normalized using their UTF-8 sequences, ASCII uppercasing is performed directly, temporary string operations are reduced, and Cologne/Levenshtein use compact buffers.

    The SQL interface and results remained unchanged.

    11. Optimization effect in Free Pascal

    Function

    Original FPC

    FPC Fast UTF-8

    Improvement

    SOUNDEX

    ~136 ms

    ~40 ms

    ~3.4×

    SOUNDEX_DE

    ~79 ms

    ~47 ms

    ~1.7×

    COLOGNE_PHONETIC

    ~152 ms

    ~43 ms

    ~3.5×

    COLOGNE_DISTANCE

    ~269 ms

    ~62 ms

    ~4.3×

    PHONETIC_SIMILARITY

    ~271 ms

    ~62 ms

    ~4.4×

    Most of the performance gain was therefore achieved without changing programming language.

    12. Optimized FPC versus Visual C++

    Function

    Visual C++ 2022

    Optimized FPC

    Approx. C++ lead

    SOUNDEX

    ~34 ms

    ~40 ms

    ~18%

    SOUNDEX_DE

    ~38 ms

    ~47 ms

    ~24%

    COLOGNE_PHONETIC

    ~38 ms

    ~43 ms

    ~13%

    COLOGNE_DISTANCE

    ~51 ms

    ~62 ms

    ~22%

    PHONETIC_SIMILARITY

    ~52 ms

    ~62 ms

    ~19%

    With comparable implementations, the gap fell from an apparent factor of four or five to typically about 10 to 25 percent.

    13. Why Lazarus needs essentially only Firebird.pas

    The Object Pascal binding is compact from the developer's perspective. Firebird.pas bundles the important interfaces and type declarations into a Pascal unit, keeping a small Lazarus UDR project easy to understand and familiar to Delphi/Lazarus developers.

    14. Why Visual Studio needs more headers

    The C++ UDR uses Firebird's C++ helper infrastructure, including UdrCppEngine.h, Message.h, Interface.h, ibase.h and additional include files and preprocessor helpers.

    These are mainly compile-time dependencies. The finished DLL does not simply require all those headers at runtime. Pascal packages many declarations into one unit, while C++ distributes the API across headers, templates and macros.

    15. Windows and Linux

    PSQL is platform-neutral inside the database. Native UDRs must be built for the target platform, typically a DLL on Windows and a shared library on Linux. The SQL contract can remain the same, but the binary must match the operating system, architecture and Firebird server.

    16. Practical decision

    For moderate call volumes and maximum simplicity, PSQL is attractive. For high call volumes or computationally intensive algorithms, a native UDR provides substantial headroom.

    Where Delphi/Lazarus/FPC expertise already exists, our measurements provide no reason to switch to C++ solely out of performance concerns. C++ remains an excellent choice where the relevant expertise and build infrastructure already exist.

    17. The most important lesson

    The project started with a question: how should classic Firebird UDF functionality be modernized for Firebird 5? This led to a comparison of UDR and PSQL, and eventually to a direct test of Free Pascal and Visual C++.

    The most important result is not one millisecond figure. Architecture, algorithm and data representation often dominate language choice. Our first Pascal implementation was correct but used convenient general Unicode abstractions. The C++ version worked closer to the bytes actually required and was initially dramatically faster. Once the same principles were applied to Free Pascal, most of the difference disappeared.

    For developers with many years of Delphi or Free Pascal experience, this is a notable result: well-written Pascal remains highly competitive native code. Visual C++ was still somewhat faster in our test, but the remaining gap was closer to roughly 10 to 25 percent than to a factor of four or five.

    Firebird PSQL was also a positive surprise. Not every function justifies a native library. Simple phonetic functions can offer an attractive balance of performance, maintainability and effortless deployment as stored functions. Native UDRs become particularly valuable when high call volumes and more complex calculations occur together.

    The practical conclusion is therefore: choose the right algorithm and data representation first, then choose the deployment strategy, and only after that treat the programming language itself as a performance factor.

    18. Demo projects and reproducibility

    The complete source code is intentionally not reproduced in this white paper, keeping the document readable for managers and users as well as developers.

    Demo projects for Firebird PSQL, Lazarus/Free Pascal and Visual Studio/C++ can be provided on request. Benchmark values are snapshots of a specific environment: hardware, Firebird version, compiler options, data distribution, cache state and server load can all affect absolute timings. Reproducible test data, identical results and repeated runs matter more than a single best time.


    Training: Firebird SQL und Pascalprogrammierung für die Next Generation

    (English language version here)

    16.-18. November 2026 9.00-17.00 Uhr in München

    Drei intensive Schulungstage für die nächste Entwicklergeneration: Die Teilnehmer lernen, wie Pascal-Projekte mit Delphi und Lazarus aufgebaut sind, wie Firebird-Datenbanken funktionieren und wie beides in IBExpert professionell zusammengeführt wird.

    Next Generation

    Im Mittelpunkt stehen nicht theoretische Sprachdetails, sondern das Wissen, das junge Entwickler benötigen, um in bestehenden Unternehmensprojekten produktiv mitarbeiten zu können - einschließlich des sinnvollen und verantwortungsbewussten Einsatzes von KI-Werkzeugen wie ChatGPT und Codex.

    Weitere Information: https://ibexpert.net/cms/training#German
    Anmeldung an register@ibexpert.net

    Diese 3-tägige Praxisschulung kann auch als Remote- oder Onsite-Firmenschulung, in der wir dann Ihre schon existierende Software und Datenbank als Basis nehmen, gebucht werden.

    Für die nächste Entwicklergeneration

    Nicht als Rückblick auf alte Entwicklungswelten, sondern als praxisnaher Einstieg für Menschen, die künftig produktiv an bestehenden Systemen mitarbeiten sollen. Keine praktische Erfahrung mit Delphi, Lazarus, Firebird oder IBExpert erforderlich.

    Geeignet für
    • Auszubildende, Studierende und Berufseinsteiger mit grundlegenden Programmierkenntnissen
    • Quereinsteiger, die künftig an Delphi-, Lazarus- oder Firebird-Projekten mitarbeiten sollen
    • Junior-Entwickler ohne praktische Erfahrung in größeren, gewachsenen Anwendungen
    • Unternehmen, die Nachwuchskräfte schneller und strukturierter in bestehende Projekte einarbeiten möchten
    Empfohlene Voraussetzungen
    • Grundverständnis für Variablen, Bedingungen, Schleifen und einfache Programmabläufe
    • eigener Windows-Notebook-PC empfohlen; genaue Software-Vorbereitung folgt vor der Schulung
    • Bereitschaft, Quellcode und SQL nicht nur zu erzeugen, sondern systematisch zu lesen und zu prüfen