Translate

Donnerstag, 2. Oktober 2025

APEX Calendar - vertikale Schrift mit Feiertagen

 Kürzlich habe ich (mit Hilfe ChatGPT) dieses hier realisiert:

Die Feiertage (auf meiner P12) tauchen im Kalender als vertikale Einträge auf.

Sieht so easy aus.... aber ist nicht trivial... aber machbar... wie folgt:

Mein SQL für den Kalender sieht so aus für Platz 1 (Region):
(PS: für 4 Plätze habe ich 4 Regionen untereinander oder nebeneinander...)

select ID,
    case 
    when partner is null then name||'<br>'||Gastspieler
    else name||'<br>'||partner
    end anzeige,
       TAG,
       TAG_BIS,
       PLATZ,
    case 
    when type='Manschaftstraining' then 'apex-cal-cal-green' --'apex-cal-green' 
    when type ='Buchung' and BALLMASCHINE = 'Y'  then 'apex-cal-red' 
    when type ='Buchung' and GASTSPIELGEBUEHR = 10  then 'apex-cal-gray'
    when type='Buchung'      then 'apex-cal-cyan' -- cyan ist gut hellgrün
    when type='Punktspiel'   then 'apex-cal-orange'
    when type='Training'     then 'apex-cal-lime'
    when type='gesperrt'     then 'apex-cal-black' 
    when type='Feiertag'     then 'apex-cal-yellow'
  end as css_farbe,
  BEMERKUNGEN
  from TENNIS_BOOKING_TAG
where PLATZ = 1

Nun zu den "Feiertagen":

1. Dazu benötige ich zunächst eine Tabelle mit den Feiertagen..."vc_holidays_de" (ID, Name, Datum)

2. dann einen Before_Header pl/sql Process "get_holidays_de" der füllt :P12_Holidays_json mit dem Namen des Feiertags:

declare

  l_json clob := '[';
  l_cnt  integer := 0;
begin
  for rec in (
    select to_char(holiday_date, 'YYYY-MM-DD') as holiday_date,
           name
      from vc_holidays_de
     where holiday_date between trunc(sysdate, 'YYYY') and trunc(sysdate + 365)
  )
  loop
    if l_cnt > 0 then
      l_json := l_json || ',';
    end if;
    l_json := l_json || json_object(
      'date' value rec.holiday_date,
      'name' value rec.name
    );
    l_cnt := l_cnt + 1;
  end loop;
  l_json := l_json || ']';
  :P12_HOLIDAYS_JSON := l_json;
end;


3. Platz 1 - Region --> Attributes --> JS initialisation options :

ein Javascript auf P12 fügt den Namen ein (siehe im 2. Screenshot ganz unten):

JS Code:

function(pOptions) {

  return getCalendarOptions("PLATZ1", "P12_HOLIDAYS_JSON", pOptions);

}














das ist aber noch nicht alles.... jetzt zum CSS... und der vertikalen Darstellung:

Das folgende CSS rufe ich durch 
#WORKSPACE_FILES#holidays.css auf der Seite 12 auf bei den Page Attributes unter CCS, files/URL auf 

und habe es vorher als Workspace_file bei den Shared Components gespeichert.
Es sieht so aus:

.fc .fc-holiday {
    background-color: #e0e0e0 !important; /* light grey for holidays */
}
.fc .fc-weekend {
    background-color: #f0f0f0 !important;
}
.fc .fc-holiday-label {
  font-size: 14px;
  color: #a00;
  writing-mode: vertical-rl; /* vertical text */
  transform: rotate(180deg); /* read from top to bottom */
  position: absolute;
  top: 22px;
  left: 5px;
  z-index: 10;
  background-color: rgba(255, 255, 255, 0.7);
  padding: 2px;
  border-radius: 3px;
  max-height: 200px;
  overflow: hidden;
}
.fc .fc-daygrid-day-frame,
.fc .fc-timegrid-slot,
.fc .fc-day {
  position: relative;
}

Der Vollständigkeit halber:

Auch braucht man für den FULLCALENDAR diesen Eintrag auf Page-Level bei Javascript URL:
#WORKSPACE_FILES#fullcalendar_options.js

Die leicht angepasste Standard-Datei in den Shared Compoments sieht so aus:

function getCalendarOptions(regionId, holidaysItemId, pOptions) {
  // Load holidays JSON from page item
  const raw = $v(holidaysItemId);
  let holidays = [];
  try {
    holidays = JSON.parse(raw);
  } catch (e) {
    console.warn('Could not parse holidays JSON:', e);
  }
  // Modify existing pOptions IN-PLACE
  pOptions.locale = 'de';
  pOptions.initialView = 'timeGridWeek';
  pOptions.slotMinTime = "07:00:00";
  pOptions.slotMaxTime = "22:00:00";
  pOptions.expandRows = true;
  pOptions.height = '100%';
  pOptions.slotDuration = "01:00:00";
  pOptions.dayHeaderFormat = { weekday: 'short', month: 'numeric', day: 'numeric' };
  pOptions.titleFormat = { day: 'numeric', month: 'numeric', year: 'numeric' };
  pOptions.weekNumbers = false;
  pOptions.weekNumberCalculation = 'ISO';
  pOptions.displayEventTime = true;
  pOptions.displayEventEnd = true;
  pOptions.allDaySlot = false;
  pOptions.disableKeyboardSupport = true;
  pOptions.windowResize = null;
  pOptions.slotLabelFormat = { hour: '2-digit', minute: '2-digit', hour12: false };
  pOptions.eventTimeFormat = { hour: '2-digit', minute: '2-digit', hour12: false };
  pOptions.dayCellDidMount = function (info) {
    const day = info.date.getDay();
    // Style weekends
    if (day === 0 || day === 6) {
      info.el.classList.add('fc-weekend');
    }
    // Format date YYYY-MM-DD
    const dateStr = info.date.getFullYear() + '-' +
      String(info.date.getMonth() + 1).padStart(2, '0') + '-' +
      String(info.date.getDate()).padStart(2, '0');
    const holiday = holidays.find(h => h.date === dateStr);
    if (holiday) {
      info.el.classList.add('fc-holiday');
      if (
        info.view.type === 'timeGridWeek' &&
        info.el.classList.contains('fc-timegrid-col')
      ) {
        const label = document.createElement('div');
        label.className = 'fc-holiday-label';
        label.textContent = holiday.name;
        info.el.prepend(label);
      }
    }
  };
  return pOptions;
}

Viel Erfolg bei der Umsetzung!

Donnerstag, 24. Oktober 2024

ZUGFeRD - xRechnung - development status - any idea on PDF/A3 (PDF and xml-file)

 ZUGFeRD - schonmal gehört ? (digitale Rechnung für B2B)

ab 1.1.2025 Pflicht für Unternehmen (und teilweise auch Vereine).

Erklärung:
ZUGFeRD (=Zentraler User Guide des Forums elektronische Rechnung Deutschland) ist ein einheitliches Datenformat für elektronische Rechnungen und wird seit 25.06.2017 allen interessierten Unternehmen und Behörden kostenlos zur Verfügung gestellt.
ZUGFeRD basiert auf PDF/A-3 und bietet die Möglichkeit, eine XML-Rechnung in ein PDF einzubetten und dadurch sowohl strukturierte Rechnungsdaten (XML) als auch das Rechnungsbild (PDF) gleichzeitig per E-Mail zu übermitteln.
Durch PDF/A-3 wird die Unveränderbarkeit der Daten sichergestellt und die empfangenen strukturierten Daten können ohne weitere Bearbeitung, wie z.B. das Einscannen einer „normalen“ PDF-Rechnung, ausgelesen und automatisiert weiterverarbeitet werden.
Quelle: 
https://www.truecommerce.com/de/faq/zugferd/

Als APEX Entwickler habe ich mich (für meinen Sportverein) nun daran gemacht, dieses umzusetzen. 

Ich bin mit der Entwicklung mittlerweile soweit:
- eine (eingehende) xml-Rechnung einlesen (und in APEX im Formular darstellen) - als auch
- eine (ausgehende) generieren (wenn auch noch nicht mit allen Segmenten/Elementen)...
aber ich bin dran... mittels pl/sql Procedure und XMLSERIALIZE und XMLelement etc. das Prinzip habe ich verstanden...
jetzt ist es noch Sisyphus-Arbeit. Alles im ZUGFeRD-Format.

Das langfristige Ziel soll sein:
A) xml-Rechnung empfangen, in der Buchhaltung verbuchen und archivieren
B) Rechnung erstellen, als xml generieren und als PDF/A3 mailen und archivieren

Ab 1.1.2025 müssen Unternehmen - auch Vereine (teilweise) - in der Lage sein, xml-Rechnungen zu empfangen und einzulesen
siehe: https://lsb-niedersachsen.vibss.de/vereinsmanagement/aktuelles/detail/elektronische-rechnungen
Achtung: Auch gemeinnützige Vereine gelten als Unternehmen, wenn sie nicht ausschließlich im ideellen Bereich tätig sind.

Wenn meine Procedures/Packages soweit stabil und leidlich vollständig sind, packe ich die mal auf Github.

Frage in die Runde:
Hat eine/r Lust sich an der Entwicklung zu beteiligen ? 
Speziell zum Thema PDF/A3-erstellen ist noch einiges offen...

Aktuell könnte ich lediglich PDF (mit Jasper Reports) und die Rechnung.xml separat von einander erstellen und per Email versenden (aus APEX)... aber das ist nur die halbe Miete.

Meldet Euch gerne bei mir (bernhard at fischer-wasels.de)

Montag, 7. Oktober 2024

I still miss Joel #JoelKallmanDay

 Am 16. Oktober ist wieder "Joel Kallman Day" und wir sollten ihm alle gedenken.

Joel ist leider Opfer von Covid19 geworden und verstorben.

Als ehemaliger Oracle Mitarbeiter (15 Jahre) und APEX Enthusiast traf ich Joel bei mehreren Konferenzen (hauptsächlich DOAG) - er unterstützte aber auch meine HTMLDB/APEX Workshops, die ich deutschlandweit hielt.
Meine vermeintlich letzte Chance ihn zu treffen war in 2017, als ich mit meiner Familie die Ostküste bereiste (von New York nach Miami...) und 5 Tage in den Blue Ridge Mountains bei Burnsville (Mt.Mitchell), North Carolina weilte... bis nach Ohio wäre es nicht weit gewesen... Aber Joel war schon wieder aktiv auf einer Konferenz in LA. So war er.

Ich hätte ihn gerne in seiner Heimat besucht und getroffen.

Joel war ein Musterbeispiel an "Community Leader" und gegenüber jedem hilfsbereit, offen und speziell "seiner" APEX community sehr zugewandt.

Gott habe ihn seelig. #JoelKallmanDay


 (eins von vielen...) Joels APEX introduction video und wie APEX in der Covid-19 Pandemie ein USA-weiter Helfer für die Krankenhäuser wurde






Freitag, 2. Juni 2023

Interactive Grid - customize Toolbar - add button und actions

Auch wenn es ein Crossposting ist...  möchte ich diese tolle Anleitung und Erklärung der GRID Funktionen rund um den Toolbar kurz hier erwähnen...

Link : https://tm-apex.hashnode.dev/customize-your-toolbar-interactive-grid-9

Danke an Timo Herwix....

Donnerstag, 2. Februar 2023

Es lohnt sich, Ideen beim APEX-Development einzubringen:










Oracle APEX Ideas & Feature Requests


Mal sehen, was hieraus wird... Bitte Voten !!!! (;-)

FR-2958: APEX_SUCCESS_MESSAGE to fade/dismiss after 3-5 secs - Oracle APEX




aktuell (Apex 22.1) funktioniert es hiermit:
apex.jQuery(function() {
  apex.theme42.util.configAPEXMsgs({
    autoDismiss: true,
    duration: 3000  // duration is optional (Default is 3000 milliseconds)
  });
});
--> Page attributes --> "execute when page loads"

Donnerstag, 10. März 2022

Label of Item alignment LEFT

Oracle APEX (since 5.0) comes with default settings for the labels of items "RIGHT" which looks like:

For several items on a page there is ample space wasted... and to my opinion labels aligned LEFT looks much more "in order"....

How to fix?

Go to "Region" settings -->
Appearance

Template: Standard

Template Options: Advanced --> Lable aligned: LEFT

and all lables of the items are nicely order left...

That's the trick.

Before:


After:










Good luck ! [ nächstes Mal wieder in DE]

And . . . . . . 

You can set this in your Region template!
How to ?

Go to Shared Components
pick: Templates
search for "Region" (templates) and copy "Standard" using the copy icon in the most right column and
name it: "Standard_labels_left" -
Create your new template.
Then search for it again and edit it (click on "Standard_labels_left") and you will see:





 







Now you can switch from "right" to "left" easily - and apply changes.


Whenever you have a form and like the labels to be aligned "LEFT", just assign this template to your region.

my 2 cents.

Donnerstag, 17. Februar 2022

Play beep sound

APEX 21.2 

Für die Bestätigung eines Befehles habe ich gerade mit einem "Beep-Sound" experimentiert, den ich als "Bestätigungs-Ton" nutzen möchte.

Hier meine APEX-Lösung:

1. "Beep-Sound" als "wav-Datei" runterladen... (von: https://www.soundjay.com/beep-sounds-1.html)

2. Die Datei "beep-02.wav" in Shared Components" als "application file" hochladen

3. -- > #APP_FILES#beep-02.wav

4. Seite erstellen mit einer Region namens "Region für Sound"
und einem Button namentlich "Play sound"...

5. Bei den Seitenattributen unter "Page HTML Body Attribute" einfügen: 

<script>
$('<audio id="chatAudio">
<source src="#APP_FILES#beep-02.wav" type="audio/wav">
</audio>')
</script>

6. Dynamic Action bei "Click" anlegen mit Namen: "sound"
    when: click
    selection type: button
    Button: Play_sound

7. "add True action" vom Typ "Execute Javascript Code" und bei

settings/code:     $('#chatAudio')[0].play();  

Referenz: https://stackoverflow.com/a/29517759

Danke an Okwo Moses !!! 

Der exakte Usecase folgt....

Viel Spaß damit !