Ich muss aus einem anderen Grund auch mehrere exe Dateien erzeugen. Umbenennen kann ich nicht da dann die TextControl Lizenz nicht mehr geht.
Ich kopiere per Programm die SLN-Datei und ersetze in dieser die Namen die brauche. Dann wird halt x Mal übersetzt, aber das stört mich nicht.
Grüße Bernd
Ich benutze auch noch Crystal Reports und installiere beim Kunden immer neueste Runtime. Das hat schon öfter Probleme gegeben.
Am Ende habe ich mir so beholfen dass ich die DLL's auch in das App Verzeichnis kopiert habe.
Die meisten Reports habe ich inzwischen auf Microsoft Report Builder umgestellt, der ist eh besser zu bedienen und braucht vor allem keine lokale Installation.
Grüße Bernd
Danke für die tolle Übersicht.
Leider ist der Ton teilweise nicht sehr gut, da viele von zuhause senden.
Grüße Bernd
Mach es doch vor dem Serialisieren :
if (checkBoxVorname.Checked) person.Vorname = textBoxVorname.Text; else person.Vorname = null;
if (checkBoxNachname.Checked) person.Nachname = textBoxNachname.Text; else person.Nachname = null;
1 Zeile pro Feld, geht doch.
Natürlich kannst Du auch die Textboxen in einer Schleife durchgehen und die Checkbox dazu abfragen, aber Du musst es ja eh der Klasse zuweisen.
Finde ich auch nicht so elegant.
foreach(Control ctrl in ..Controls)
{
string tb = ctrl.Name;
string cb = ctrl.Name.Replace("textBox","checkBox");
if (tb.Startswith("textBox")) (CheckBox)Controls[cb] ...
}
Grüße Bernd
Die Informationen müssen dann ja noch vom PC zum Raspberry übertragen werden.
DMX ist natürlich totaler Overkill, aber ist sehr robust und bewährt.
Ist eine serielle Technologie (RS485) : Störsicher und man kann lange Kabel legen.
Ist auch nicht so teuer wie ich dachte, um die 100 Euro die Hardware.
Hier eine Einführung in DMX von meinem Kumpel Mike : https://www.youtube.com/watch?v=1Lza-jJp9-g
Bin gespannt welche Lösung es werden wird.
Grüße Bernd
Man kann ja beide Hardware kaufen und testen, kostet ja nichts.
Mit DMX gibt es auch professionelle Hardware für Lichtsteuerung : https://www.led-studien.de/dmx-led-controller/
Hier gibt es ein C# Framework dafür : redpawfx/quickDMX512
Hier eine fertige Platine für 30 LED's : https://www.xmas-land.de/30-Kanal-DMX-512-Controller-Platine#false
Grüße Bernd
Der Raspi ist da etwas überqualifiziert glaube ich.
Mit einem Arduino geht das auch : https://starthardware.org/blink-start-mit-arduino/
Bei mehreren oder größeren LED's macht man Transistoren dazwischen als Verstärker.
Beim Arduino ist das Ein- und Ausschalten einfacher und die Kommunikation mit dem PC.
Meiner Meinung nach.
Mit einem ESP32 oder ESP8266 geht das auch per WLAN oder Bluetooth.
Grüße Bernd
Wenn Du was selbst bauen willst kannst Du einen Arduino per USB anschließen, den kann man seriell ansteuern. Da gibt es bestimmt fertige Platinen für die Ansteuerung von LED's.
Einen Arduino kann man sehr gut in Visual Studio programmieren in C#.
Ich glaube hier kann man jede LED einzeln ansteuern : https://starthardware.org/viele-leds-mit-arduino-steuern-ws2812/
Das sind mal viele LED's : Amazing 16x16x16 RGB LED cube - Embedds
Grüße Bernd
Hallo Ruzbacky,
ich verstehe den Unterschied deiner 2 Möglichkeiten nicht so ganz.
Typisierte DataSets nimmt man nicht mehr.
Am besten lässt Du das Mapping jemand machen, z.B. ein ORM oder Micro ORM.
Den Connectionstring hinlegst Du natürlich so dass er vom Benutzer geändert werden kann.
Schau mal hier : https://download.seven-c.de/files/DatenbankenHowTo.htm
Grüße Bernd
Ist schon lange her dass ich das Oracle Typ Mapping gemacht habe, auf jeden Fall mehr als 12 Jahre.
Damals wurde mir von den Experten das "decimal" als Datentyp für ein logisches Feld genannt.
Der Vorteil des Mappings : Man kann den Typ ganz einfach ändern im Source und sofort auf die neuen Datentypen zugreifen.
Das kommt auch dann vor wenn ein Datenbank Update neue Datenbanktypen bringt die geeigneter sind (MS SQL Datumstyp Date oder Datetime2).
Performance ? Das Mapping oben war ca. 5% langsamer als typisierte DataSets. Ca. 10 Mal schneller als ein damaliges ORM.
Grüße Bernd
Ich erzeuge meine C# Zugriffsklassen automatisch aus der Datenbank.
Das Mapping ist fest hinterlegt, sind ja nur wenige Datentypen die es gibt.
public int nr { get { return ad_nr; } set { ad_nr = value; } }
public string match { get { return ad_match; } set { ad_match = value; } }
public string anrede { get { return ad_anrede; } set { ad_anrede = value; } }
public string name1 { get { return ad_name1; } set { ad_name1 = value; } }
public string name2 { get { return ad_name2; } set { ad_name2 = value; } }
public string strasse { get { return ad_strasse; } set { ad_strasse = value; } }
public string hausnr { get { return ad_hausnr; } set { ad_hausnr = value; } }
public bool kunde { get { return ad_kunde; } set { ad_kunde = value; } }
Das logische Feld ad_kunde ist je nach Datenbanksystem entweder boolean oder sbyte (MySQL) oder decimal (Oracle) :
if (rw["ad_kunde"] is Boolean) kunde = (bool)rw["ad_kunde"]; else if (rw["ad_kunde"] is sbyte) kunde = ((sbyte)rw["ad_kunde"] == 1); else kunde = ((decimal)rw["ad_kunde"] == 1);
Grüße Bernd
Es funktioniert !
Das Problem war dass beim Ändern von Zertifikat, Apple ID, App ID oder Provisionierungsprofil die alten Werte immer irgendwo stehen bleiben und leider manchmal benutzt werden. Die automatische Bereitstellung in iOS-Bundle-Signierung hört sich gut an, kann man wohl für Beta Versionen per Ad Hoc Distrubution nicht benutzen.
Lösung war das manuelle Löschen der Dateien für Zertifikate und Profile.
Meine Schritte auf dem Windows 10 Rechner :
Dateien in C:\Users??\AppData\Local\Xamarin\iOS\ löschen
Apple ID neu hinzufügen, Profile laden
Verzeichnis löschen : C:\Net\Android\Finderwille Einsatz App\XamarinForms.LocationService.iOS\obj\iPhone\Release
iOS Projekt bereinigen und neu erstellen
Extras / iOS / Mit Mac koppeln
iOS-Bundle-Signierung
(*) Manuelle Bereitstellung
Signierungsidentität : Apple Distribution: Bernd Quambusch (828G3XCPH9)
Bereitstellungsprofil : Finderwille Ad Hoc Distribution
Benutzerdefinierte Berechtigungen : <Dateiname Löschen>
Release iPhone XamarinForms.LocationService.iOS Natascha's iPhone 6s
Das iPhone ist am Mac angeschlossen und Bildschirm entsperrt.
Starten ohne Debuggen (Strg + F5)
iOS Archivieren
Verteilen / Ad Hoc
Manuelle Bereitstellung
Signierungsidentität : Apple Distribution: Bernd Quambusch (828G3XCPH9) (1. Auswahl von 4 Einträgen)
Bereitstellungsprofil : Finderwille Ad Hoc Distribution
[Speichern unter]
[Ordner öffnen]
C:\Archives *.ipa auf Website hochladen und Info.plist Datei erstellen.
Nun kann ich die App von der Website per Klick installieren : https://www.finderwille-frankfurt-main.de/finderwille-einsatz-app-betaversion/
Die Entwicklung von mobilen Apps in xamarin.forms gefällt mir gut, eine tolle Sache ! Wird nicht meine letzte App bleiben.
Allerdings ist die Integration noch nicht perfekt, es hakt an vielen Stellen.
Beispiele :
Date Picker geht nicht im Dark Mode
Beim Löschen von Zertifikaten, Apple ID, App ID oder Provisionierungsprofil müssen die Dateien dazu manuell gelöscht werden
Man kann die Developer ID im Visual Studio auf dem Mac nicht editieren oder löschen
/bin/release Verzeichnis auf Windows Rechner muss man vor dem Build manuell löschen
Der Windows Rechner verliert immer die Verbindung zum Mac, muss man immer manuell neu verbinden
Android : In der Standard Installation gibt es immer den Fehler "Copy of the mdbs files failed". Man muss die Pfadeinstellungen für Archive ändern und kürzere Pfade eintragen.
Es kommt öfter vor dass bei Xamarin die Pfade länger als 256 Zeichen werden und Windows damit nicht zurecht kommt.
Siehe https://github.com/xamarin/xamarin-android/issues/5584
Die kostenlose Bereitstellung besser ignorieren und überhaupt nicht damit anfangen, auch wenn es anfangs verlockend klingt.
Für die Bereitstellung am besten 2 iOS Devices benutzen, eines zum Erstellen des Projektes und eines zum Testen der Installation.
Zu meiner ursprünglichen Frage : Man kann die App mit Openssl.exe oder xcode tools auch per Script signieren und packen, da muss man sich aber besser auskennen. Das mache ich vielleicht später mal.
Grüße Bernd
Es gibt anscheinend Möglichkeiten mit den Xcode Tools zu signieren. Leider bekomme ich es noch nicht mal in der IDE hin.
Bisher habe ich es genau einmal hinbekommen dass eine App rausgekommen ist die man installieren konnte. Und die lief genau einen Tag, dann ließ sich die App nicht mehr starten.
Jetzt schreibe ich jeden Schritt genau auf, damit ich es reproduzieren kann.
Folgende Schritte mache ich um eine App fürs iPhone zu erzeugen :
Auf dem Windows 10 Rechner :
Alle Zertifikate / Profile löschen
Extras / iOS / Mit Mac koppeln
Clean / Rebuild / Deploy Project
Release iPhone XamarinForms.LocationService.iOS Remotegerät (falls Natascha's iPhone 6s nicht vorhanden)
Starten ohne Debuggen (Strg + F5)
Release iPhone XamarinForms.LocationService.iOS Natascha's iPhone 6s
Starten ohne Debuggen (Strg + F5)
Eigenschaften XamarinForms.LocationService.iOS
iOS-Bundle-Signierung
Schema : (*) Automatische Bereitstellung
Team : Bernd Quambusch - Individual - 828G3XCPH99 (bq@go-online.de)
5a. Apple Konto entfernen / hinzufügen
5b. Eigenschaften XamarinForms.LocationService.iOS
iOS-Bunde-Signierung
Schema : (*) Manuelle Bereitstellung
Signierungsidentität :
Team : Bernd Quambusch - Individual - 828G3XCPH99 (bq@go-online.de)
Projektmappe XamarinForms.LocationService.iOS
Archivieren
[Verteilen] [Ad-hoc]
Extras / iOS / Mit Mac koppeln
8a. Extras / Optionen / Xamarin / iOS-Einstellungen
Speicherort für Archive : C:\Archive (Sonst kommt Fehler MDB Files ...)
Enable Hot Restart = Nein
Archiv-App signiert mit : B4120F70629EC3....
Manuelle Bereitstellung
Signierungsidentität : Bernd Quambusch (2. Eintrag)
Bereitstellungsprofil : Finderwille Einsatz App Distribution
Speichern unter : C:\Users\bq\AppData\Local\Xamarin\iOS\Archives
XamarinForms.LocationService.ipa [Speichern]
[Ordner öffnen]
C:\Users\bq\AppData\Local\Xamarin\iOS\Archives
XamarinForms.LocationService.ipa hochladen
Auf dem Mac
========
Visual Studio starten
iOS als Startprojekt festlegen
Release | iPhone : Generisches Gerät
iOS Einstellungen : iOS-Bündelsignierung / Signierungsidentität Verteilung: Bernd Quambusch (828G3XCPH9)
Bereitstellungsprofil : Ad-hoc (automatisch)
Erstellen : Projektmappe bereinigen / neu erstellen
iOS : Für Veröffentlichung archivieren
Signieren und verteilen / Ad Hoc
Apple Developer Portal :
Profiles : Generate
() iOS
() Ad Hoc
App ID : Visual Studio Wildcard
Certificate : Bernd Quambusch (Distribution)
[x] Select All Devices
Name : Finderwille Ad Hoc Distribution
[Generate]
Bereitstellungsprofil ( ) Vorhandene Identität und vorhandenes Bereitstellungsprofil verwenden
59B87C2...
(*) Mit anderer Identität und anderen Bereitstellungsprofil erneut signieren
Signierungsidentität : Distribution: Bernd Quambusch (828G3XCPH9)
App : ...iOS.app
Bereitstellungsprofil : Finderwille EInsatz App Distribution
[Veröffentlichen]
[Ersetzen]
Die erzeugte IPA Datei funktioniert leider nicht.
Auf dem iPhone : " 'Finderwille Einsatz App' kann nicht installiert werden. Versuche es später noch einmal."
Auf der System Konsole des iPhones steht nur : "This app could not be installed at this time" "Invalid Status Code 484" "Error Domain ... Code 1404"
Weitere Fehlermeldungen gibt es nicht.
Da muss ich mal weiter probieren ...
Oder hat da jemand eine idee ?
Grüße Bernd
ich habe jetzt einen kostenpflichtigen Account bei Apple Developer und habe es nun geschafft eine Beta Version Online zu stellen (Adhoc Deployment).
Der kostenlose Account kann nicht viel und man macht mehr kaputt damit. Ich musste viele Umwege gehen bis App ID, Bundle ID, Certificate, Provisioning Profile und Signature funktioniert haben. Am Ende musste ich alle löschen und neu vom VS erstellen lassen.
XCode ist sehr wackelig und ich habe nun alles auf dem Windows Rechner gemacht. Der Mac muss eingeschaltet sein und ein iPhone muss angeschlossen sein. Zum Glück bekomme ich ein altes iPhone geschenkt. Das Windows Visual Studio läuft gut mit dem Mac zusammen und holt sich alle notwendigen Dokumente von der Apple Developer Seite. Und legt alles an was man braucht !
Hier ist das Ergebnis : Die Finderwille Einsatz App Betaversion | Finderwille Frankfurt/Main
Bitte nicht installieren, ich brauche zuerst die iPhone Seriennummer (UDID), sie muss in das Package eingetragen werden.
Grüße Bernd
Ja, ist quick and dirty.
Eine saubere Trennung ist besser.
public double HauptspeichernutzungInMegabyte()
{
return Environment.WorkingSet / 1024 / 1024;
}
Gilt für 32-Bit Applikationen.
Grüße Bernd
Außerdem prüfe ich den Hauptspeicherbedarf. Wenn ein Anwender versucht eine Liste mit 100 Millionen Datensätzen anzuzeigen kommt eine entsprechende Fehlermeldung.
Wie kannst Du das denn, wenn doch der Reader strikt vorwarding ist, du also noch gar nicht weißt, wie viele Daten kommen werden?
Meine Applikation ist 32 Bittig und ich erlaube 768 MB Hauptspeichernutzung beim Erstellen des Reports. Bis zu 2048 MB sind möglich.
Wenn man eigene Arrays / Listen benutzt spart man viel Speicher gegenüber einer DataTable, da diese die Zeilen mehrfach speichert.
So auf die Schnelle :
using (SqlDataReader x_reader = x_ermittle_verpackungen_kunde.ExecuteReader())
{
while (x_reader.Read())
{
cBestaende.Rows.Add(...);
if (HauptspeichernutzungInMegabyte() > 768) { Message("Der Bericht ist zu groß um ihn vollständig auszugeben !"); break; }
progresslabel.Text = " Bericht wird erstellt ... " + (index++ * 100 / length).ToString() + " % ";
progresslabel.BringToFront();
Application.DoEvents();
}
}
"Application.DoEvents();" ist böse, besser einen eigenen Task für die Anzeige erstellen.
Grüße Bernd
using (SqlDataReader x_reader = x_ermittle_verpackungen_kunde.ExecuteReader())
{
while (x_reader.Read())
{
cBestaende.Rows.Add(...);
}
}
Ob das schneller ist weiß ich nicht. Aber man kann dem Anwender eine Progressbar anzeigen und einen Abbruch Button zur Verfügung stellen.
Bei mir hat alles was länger als 2 Sekunden dauert eine Progressbar.
Außerdem prüfe ich den Hauptspeicherbedarf. Wenn ein Anwender versucht eine Liste mit 100 Millionen Datensätzen anzuzeigen kommt eine entsprechende Fehlermeldung.
Grüße Bernd
Ja, Neustart ist immer gut !
Der SQL Server bekommt den gesamten SQL Befehl und übersetzt ihn und führt ihn aus. Das ist ja Sinn der Sache.
Wenn Du eienn SQL Befehl mit Parametern übergibst dann setzt der SQL Server die Parameter ein, Du musst Dich nicht um länderspezifische Darstellung oder Sonderzeichen kümmern (SQL Injection).
Die Parameter haben noch den Vorteil dass der SQL Server jedes Kommando nur einmal übersetzen muss wenn sich nur die Parameter ändern.
Ich verzichte bei großen Datenmangen auf Tables und DataSet weil man nie weiß was beim Kunden passiert.
Lieber DataReader und selber durchgehen.
Grüße Bernd
Und was passiert bei
while (x_reader.Read())
{}
Was soll mit den Daten geschehen ?
DataSet und DataTable ist wie Abt schon gesagt sehr speicher- und zeitintensiv.
Ich benutze bei großen Datenmengen nur DataReader. Beim DataTable weiß man nie ob das beim Kunden funktioniert oder nicht.
Und statt select * die Spalten angeben die man braucht.
Grüße Bernd
Was passiert wenn Du exakt den gleichen SQL Befehl im Code ausführst wie der aus dem Management Studio ?
Was passiert wenn Du einen DataReader benutzt ?
Ich denke dass man das Management Studio eher mit einem DataReader vergleichen kann weil es während der Ausführung responsiv bleibt und im Hintergrund lädt.
Wenn es eine Tabelle anzeigt ist es oft noch nicht fertig mit laden.
Grüße Bernd
Danke, werde ich testen !
Hast Du dazu die Signatur aus dem Apple Developer Center benutzt ? Dann braucht man den kostenpflichtigen Developer Account, den habe ich noch nicht.
Mit XCode kann man auch ohne diesen Account signieren, ich weiß aber nicht ob nur für angeschlossene Handys gilt oder für alle Handys.
Für die Entwicklung benutze ich nur Visual Studio, auf Windows und auf dem Mac. Xcode habe ich nur für da Anmelden des iPhones und für das Signieren benutzt.
Die App werde ich später über einen Link auf der Homepage verteilen, so wie hier (2. Link) : https://www.finderwille-frankfurt-main.de/finderwille-einsatz-app-betaversion/
Grüße Bernd
Hallo,
nach einigen steinigen Wegen und 1 h Telefonat mit Apple USA und 1,5 h Telefonat mit Apple München funktioniert nun mein Mac Mini mit XCode und Visual Studio.
Visual und Studio und XCode haben ja Funktionen um Apps zu signieren (archivieren) um sie für Ad Hoc Deployment per Link auf Website bereitzustellen.
Kann man die Signaturen manuell hinzufügen z.B. mit openssl ?
Apple braucht eine p12-Datei.
Wenn man die Signaturen per Skript hinzufügen könnte würde das meinen Ablauf für die Bereitstellung erheblich vereinfachen und sicherer machen.
Außerdem kriege ich es bisher nur ab und zu hin die Signaturen für iOS zu erstellen, das ist recht wackelig in XCode.
Grüße Bernd
Das erinnert mich an eine Frage an eine Software Firma nach einem Vortrag im Jahr 1990 :
"Wir schreiben Software für Krankenhäuser und da haben wir ab und zu Patienten mit Geburtstag vor dem 1.1.1900. Das kann man nicht eingeben !"
Antwort : "Das Problem löst sich mit der Zeit von alleine !"
Grüße Bernd
Jetzt habe ich ein iPhone zum Testen. Das Testen auf einem Gerät ist leider nicht so einfach wie mit einem Android Gerät. Da dauert es nur wenige Minuten bis die App auf dem Handy läuft.
ich scheitere immer daran ein Team oder ein Bereitstelungsprofil anzulegen. Das scheint mit dem kostenlosen Entwickleraccount nicht zu gehen obwohl es gehen sollte.
Weder am mac noch am Windows PC.
Leider gibt es auch keine durchgängige Anleitung dazu.
Grüße Bernd
Ja. Dann mach mal !
Design ist nicht mein Ding.
Die Buttons kriege ich alleine hin, da wird das BorderRound / CornerRound und das BorderWidth von iOS anders umgesetzt als beim Android.
Den inaktiven Button kann man nicht lesen, mal sehen.
Ich bin ja froh dass es überhaupt läuft.
Bis es perfekt ist ist es noch etwas Arbeit.
Den Remote iOS Emulator hab ich eben getestet, er startet aber bleibt schwarz. Das war ja schon beschrieben dass der nicht geht.
Ich habe auch aus Versehen Android Code in das gemeinsame Projekt geschrieben, muss ich auch ändern. Aber so auf Anhieb eine tolle Entwicklungsumgebung für Android und iOS und läuft auch auf dem M1 !
Grüße Bernd
PS.: Zeitformat ist auch falsch bei Einsatzbeginn. Das sind aber alles Luxus-Probleme !
Meine App läuft auf Anhieb auf dem iOS Emulator des mac mini mit M1 Prozessor :
Hot XAML Reloading ist abgeschaltet !
Grüße Bernd
Mac mini ist angekommen. Visual Studio und xcode sind installiert.
Das erste Projekt läuft : Xamarin.Forms auf iOS Emulator.
Android Emulator kann ich einrichten, läuft aber nicht.
Der Remote iOS Emulator, um iOS Emulator auf Windows laufen zu lassen, soll nicht gehen, den brauche ich aber auch nicht.
Grüße Bernd
Man kann das Formular direkt in Word erstellen 😉
Man kann so etwas aber auch einfach in Winforms selber machen :
Eine Anzahl Felder, dazu Feldtitel und Format ("string 10", "double 8.2", "bool"). Schon ist ein einfacher Formulargenerator fertig.
Man kann natürlich auch eine IDE nachbauen : Crafting a C# Forms Editor from scratch
Grüße Bernd
Ich habe auch lange gebraucht bis meine App auf dem Handy lief.
Die beiden Tipps oben sind wichtig : Protokoll ansehen mit adb.exe und im Visual Studio Debuggen.
Eventuell die App nochmal vom Smartphone entfernen, mit adb uninstall, siehe im Kapitel "Update der Finderwille Einsatz App"
https://www.finderwille-frankfurt-main.de/finderwille-einsatz-app-betaversion/
Grüße Bernd
Hier sind ein paar Beispiele mit MySQL : Zugriff auf SQL Compact und MySQL
Probiere dich mit HeidiSQL anzumelden und die Abfrage auszuführen.
Grüße Bernd
Edit : Text geändert weil ich zuerst dachte Du greifst über die externe IP zu.
M1 ist bestellt, ich werde berichten !
Grüße Bernd
Da Date- und Timepicker in Xamarin.Forms m.M.n. hässlich und nicht intuitiv bedienbar sind und dazu noch im Darkmode nicht funktionieren habe ich jetzt eigene Time- und Datepicker geschrieben. Ganz ohne Design, aber sie funktionieren !
Grüße Bernd
Trotz einiger Hürden bin ich weitergekommen :
Zuerst ließ sich die App nicht auf dem Handy installieren, die Fehlermeldung lautete "App nicht installiert".
Erst nach einigen Recherchen konnte ich das genaue Protokoll mit dem Programm adb anschauen und den Fehler eingrenzen.
Mit adb konnte ich die vorherige Version komplett de-installieren und die neue Version installieren.
Das Layout hatte ich komplett auf Grid umgestellt und so passt es sich an die verschiedenen Auflösungen an. Nur die Schriftgröße nicht. Die muss man manuell anpassen.
Dazu gibt es jetzt ein Menü mit dem man die Schrift größer und kleiner machen kann.
Im Listview kann ich die Schriftgröße leider nicht ändern, das habe ich dann anders gelöst.
Die erste Rückmeldung der Beta Version : "Man kann nichts sehen !"
"Dark Mode" was ist das ?
Für den Dark Mode muss man so einige Controls anpassen, dann klappt das auch. Nur der DatePicker läuft nicht, der zeigt seine Werte weiß auf weiß an. Lässt sicher leider nicht ändern. Das ist ein known issue und wird hoffentlich bald behoben.
Inzwischen läuft die App sehr gut auf vielen verschiedenen Android Devices.
Link : https://www.finderwille-frankfurt-main.de/finderwille-einsatz-app-betaversion/
Als nächstes kommt die iOS Version dran. Ich habe nun ein MacBook Pro leiheise hier. Leider muss sehr viel installiert werden, so werde ich mir doch einen eigenen Mac zulegen.
Grüße Bernd
Ich bin auch dabei mir einen Apple zu kaufen für iOS und MacOS Apps.
Einige bekommen ihre Xamarin Projekte auf dem M1 zum laufen. Warum es manchmal nicht geht weiß nicht.
Der Fehler beim Debugging ist anscheinend im Big Sur 11.2 behoben :
Debugging on Apples M1 platform fails.
Letzter Beitrag !
Und : Xamarin Mac development on Big Sur / M1 processors?
Auch letzter Beitrag.
Die bisherige Installation auf M1 läuft natürlich auf Rosetta (x86 Emulator) : Visual Studio for Mac plans for Apple M1 / ARM-based processors/1288531
Der Remote iOS Emulator um iOS Apps auf Windows zu starten scheint nicht zu funktionieren : Remoted iOS Simulator shows up as black screen
Ich werde mir wahrscheinlich einen Mac mit einem i5 zulegen. Oder doch M1 ? No Risk no fun !
Grüße Bernd
Der Query Builder ist ja fast genauso wie mein ORM.
Ich habe es nach einem Vortrag der .NET User Group in Bad Homburg über Statemachines und Fluent APIs im Jahr 2015 geschrieben.
Ich kann diese Vorgehensweise sehr empfehlen weil die Programmierung wirklich sehr einfach und typsicher ist.
Eine Grammatik kann ich bei mir nicht einbauen da ich sonst keine fallweise Verknüpfungen machen kann wie
if (...) qry = qry.sn_nr().IsLike(SuchfeldString(such_sn_nr)).And();
Bzw. ich hab's nicht hinbekommen.
Zusätzlich erstelle ich für die Datenbankstruktur Klassen, so dass die Query typsicher ist und Intellisense funktioniert. Das macht der Query Builder nicht glaube ich.
Grüße Bernd
Ich habe bei allen Abfragen immer variable Filter.
Das sieht bei mir so aus :
// Alt
string sqlstr = "SELECT * FROM ad WHERE ";
if (such_ad_match.Text.Trim() != "") sqlstr += "ad_match LIKE '" + such_ad_match.Text.ToSqlString() + "%' AND ";
if (such_ad_nr.Text.Trim() != "") sqlstr += "ad_nr = '" + such_ad_nr.Text.ToSqlString() + "' AND ";
if (such_ad_kdnr.Text.Trim() != "") sqlstr += "ad_kdnr = '" + such_ad_kdnr.Text.ToSqlString() + "' AND ";
if (such_ad_nam1.Text.Trim() != "") sqlstr += "ad_name1 = '" + such_ad_name1.Text.ToSqlString() + "' AND ";
...
// Neu mit (eigenem) ORM und Parametern
clsDataQuery qry = new clsDataQuery("sn").Where();
if (such_sn_nr.Text != "") qry = qry.sn_nr().IsLike(SuchfeldString(such_sn_nr)).And();
if (such_sn_arnr.Text != "") qry = qry.sn_arnr().IsLike(SuchfeldStringExakt(such_sn_arnr)).And();
if (such_sn_status.Text != "") qry = qry.sn_status().IsLike(SuchfeldStringExakt(such_sn_status)).And();
...
Der Code wird maschinell erstellt für Winforms, WPF und Xamarin.Forms.
Ich finde das für den Anwender sehr komfortabel. Für den Programmierer auch.
Grüße Bernd
Sorry, habe ich falsch verstanden.
Es gibt Designer die man einbauen kann.
Es ist aber auch nicht schwierig Felder dynamisch anzuzeigen. Das klappt gut in Winforms und auch in WPF.
Die Eingabefelder kann man dann z.B. dynamisch als json in einem Datenbankfeld speichern.
Grüße Bernd
Ich finde Report Builder sehr gut. Kostet nix und kann jeder bedienen der mit Excel umgehen kann.
Report Builder / Designer 2.0 RC1 - 3.0 released
Ich hatte früher noch FYI Reporting eingesetzt, das gibts aber nicht mehr. Der Nachfolger heisst NReports.
Grüße Bernd
Hallo,
ich möchte hier mein Projekt 'Finderwille Einsatz App' vorstellen an dem ich gerade arbeite.
Durch die Beschränkung die wir zur Zeit bei Trainings und Einsätzen mit unseren Hunden haben habe ich eine App gesucht um Einsätze und einsatznahe Trainings aus der Ferne zu organisieren und die Live Standorte zu sehen. Leider habe ich da nichts gefunden. Also programmiert man so etwas selber !
Da ich mich normalerweise nur mit Desktop Software und Winforms beschäftige tu ich mich da etwas schwer. Aber man lernt ja gerne dazu.
Für die Server Applikation, die die GPS-Koordinaten entgegennehmen, speichern und darstellen soll, habe ich traccar gefunden.
Das ist eine professionelle Open Source Lösung die von Speditionen, Taxiunternehmen, Krankentransporten und Rettungsdiensten eingesetzt wird und bis zu 10.000 Geräte gleichzeitig im Blick haben kann. Der traccar Server kann neben meiner App bis zu 1200 verschiedene GPS Devices tracken, er versteht über 130 Protokolle. Also geht alles vom Hunde-GPS-Halsband bis zum Rettungshubschrauber. Für die Einsatzleitsoftware die hier in Einsätzen verwendet wird gibt es eine Schnittstelle, so dass die Einsatzkräfte auf der Karte der Einsatzleitsoftware erscheinen. Für Einsatzfahrzeuge gibt es OBD2-Dongle, die man einfach einsteckt und man sieht wo das Einsatzfahrzeug im Wald steht.
Die geplante App soll die GPS Koordinaten, einen Einsatz- bzw. Trainings-Status und einige weitere Daten an die Server Software senden.
Als Plattform habe ich Xamarin.Forms gewählt. Soll ja auch später mal auf einem iPhone laufen.
Die erste Hürde war das Laufen im Hintergrund. Das ist wohl etwas sehr böses bei einer Handy App, jeder Hersteller hat Angst um seine Akkulaufzeit.
Ich habe eine Bibliothek mit Beispiel gefunden, die das recht gut abdeckt. Hie muss auch mit einigen Tricks gearbeitet werden.
Zum Vergleich : GPS-Koordinaten abfragen und an einen Server schicken : 5 Programmzeilen. GPS-Koordinaten im HIntergrund abfragen und an einen Server schicken : 1500 Programmzeilen.
Der erste Entwurf war leider mit festen Größen und lief so nur auf meiner Handy Auflösung. Der jetzige Entwurf basiert auf Grids und passt sich vom Layout an alle Größen an. Lediglich die Schriftgröße und die Größe der Schalter muss man manuell anpassen.
Unten der Bildschirm der App (Design ist nicht mein Ding!).
Hier eine Beschreibung mit einigen Beispiel-Bildschirmen : Finderwille Einsatz App | Finderwille Frankfurt/Main
Gestern war der erste Einsatz bei einer Einsatz-Übung. Hat super funktioniert. Der Standort der Teilnehmer war sekundengenau und metergenau zu sehen.
Vorherige Lösungen wie WhatsApp Live Standort, Viewranger oder Outdoor Active hängen schon mal 15 Minuten bis der nächste Standort kommt. Da ist man schon weit in die falsche Richtung gelaufen. Außerdem sind sie in Hessen bei Einsätzen verboten, weil einsatzrelevante Daten nur auf deutschen Servern gespeichert werden dürfen.
Ich werde berichten wie es mit dem Projekt weitergeht.
Grüße Bernd
Wenn die Verbindung nicht funktioniert dann immer mit HeidiSQL probieren mit den gleichen Anmeldedaten.
Wenn es da nicht geht : Anmeldedaten falsch !
Wenn es da geht : Programm falsch !
"data source" kann man statt "server" benutzen, dann aber in 2 Wörtern !
"user id" oder "uid" für Username.
Grüße Bernd
Achte auch darauf dass es intuitiv bedienbar ist. Dass sich ein Wert ändert wenn man mit der Maus drauf klickt finde ich unüblich und nicht vorhersehbar. Ein Button mit "Alter Wert" oder so fände ich besser.
Grüße Bernd
Ich benutze schon lange MoonPDF. Der Entwickler ist auch hier im Forum.
MoonPdf - PDF Viewer Control und PDF Viewer
MoonPdfPanel - A WPF-based PDF Viewer Control
Läuft sehr gut.
Kleiner Nachteil für mich ist dass er die PDF in Bitmap rendert und man so keinen Text rauskopieren kann und Links nicht gehen.
Grüße Bernd
Schau auch hier :
http://download.seven-c.de/files/DatenbankenHowTo.htm#10
Kapitel 11 "Datenbankunabhängige Programmierung"
Grüße Bernd
JSON wird wie folgt deserialisiert :
CustomerData customerdata = JsonConvert.DeserializeObject<CustomerData>(json);
Die Klasse CustomerData kannst Du Dir aus der JSON Datei erzeugen lassen :
Grüße Bernd
Mit Dataset und ADO.NET wäre das einfacher als wenn Du Dir die SQL Kommandos selber zusammenbaust :
r2["binary"] = (byte[]) r["binary"];
Ich kopiere Tabellen und Spalten auch einzeln wenn ich nicht weiß ob die Strukturen der beiden Datenbanken gleich sind oder wenn die Datenbanken von verschiedenem Typ sind (Anderes DBMS als Microsoft).
Grüße Bernd
Bei mir sieht das so aus wenn man das Programm schließt :
mel += "Folgende Fenster sind noch geöffnet :";
foreach (Form frm in Application.OpenForms)
mel += "\r\n" + frm.Text + " : " + frm.Name;
Grüße Bernd
Eine Berechtigung kann eine Software nicht einrichten. Wenn das ginge bräuchte man keine Berechtigungen.
Das muss immer der Adminstrator der IT einrichten.
Man kann Schreib- und Lesevorgänge immer in einen try-catch Block packen, dann bekommt man immer aussagekräftige Fehlermeldungen.
Grüße Bernd
Ich kenne nur den Unterschied zwischen Advertised und Non Advertised Shortcuts.
Vielleicht hat das was damit zu tun.
Advertised Shortcuts kann man nachträglich nicht ändern.
Auswahl eines Setup-Programmes für die eigene Applikation
Grüße Bernd
Das funktioniert nur wenn genau ein Benutzer an der Datenbank angemeldet ist.
Wenn mehrere Benutzer angemeldet sind und gleichzeitig Daten erfassen ist das schwieriger.
Grüße Bernd
Das steht in der Dokumentation zu StreamWriter :
using (StreamWriter sw = new StreamWriter(file, false, Encoding.UTF8)) ...
Grüße Bernd