| |
Anzeigen |
|
|
Social Bookmark Script |
|
|
Thema: mehrere Entwickler, 1 Projekt |
|
|
Hallo Roman
| Zitat: |
Wenn ich mich recht erinnern kann, war es der Ausschluss von Verzeichnissen, die nicht in die Versionskontrolle einfließen sollten. Ich habe es damals nicht hinbekommen, z.B. das Programs- und das Data-Verzeichnis auszuschließen. D.h. jedes Kompilieren und jede Änderung an dem Probedatenbestand wurde in die Versionskontrolle mit übernommen.
|
Das liegt eher am Client. Es gibt verschiedene (wenn nicht tonnenweise) Clients für SVN. Meine Wahl fiel auf Eclipse. Ja, und zwar nur um mit SVN zu arbeiten. Ich mag keine Explorer integrationen.
Mit Eclipse ist es kein Problem, einzelne Dateien oder Dateimasken oder sogar Verzeichnisse auszuschliessen.
Aussderm musst Du in die Versionskontrolle nicht jede Datei einschiessen. Für Datendateien reicht eigentlich die DEF. Daraus kann alles wieder erstellt werden - inkl. das Filelist. Wobei zu bemerken ist, dass so ein Checkout der ganzen Umgebung nie zu zu einer funktionierenden Umgebung führt. Es muss danach noch ein Skript abgehen das die Umgebung in einen funktionierenden und konsistenten Zustand bringt.
| Zitat: |
Allerdings entwickeln wir bereits seit Jahren mit mehreren Enwtwicklern an einem System. Und es kam außerordentlich selten vor, dass tatsächlich zwei Leute am gleichen Code arbeiten mussten. Also werden wir wohl auch weiterhin keine Versionskontrolle bei uns laufen lassen.
|
Und wie kriegt ihr das Change-management in den Griff? Wie sieht es aus, wenn Kunde behauptet in Version X ging das und in Y nicht? Wie siehts aus wenn ihr Bugfixes und Weiterentwicklung unter einen Hut bringen wollt? Was ist wenn Du in den USA bist und den aktuellsten Code brauchst den deine 13 Leute weiterentwickelt haben, du selber aber auch schon Aenderungen vorgenommen hast? Wie kriegt ihr den Code Review von Version zu Version hin (Wer hat was programmiert und hat er sich an die Richtlinen gehalten) ? Etc. etc.
Mein Fazit nach 8 Jahren Versionskontrolle: Es geht nix ohne...
Gruss, Paolo
PS: Um einen Konflikt zu generieren müssen 2 Entwickler an derselben Code-Zeile rumschrauben
|
|
Thema: mehrere Entwickler, 1 Projekt |
|
|
Hier noch mein Senf dazu
Um im Team zu entwickeln führt nichts an einer Versionskontrolle à la Subversion (SVN) oder CVS vorbei. Entgegen den Aussagen von Roman möchte ich festhalten, dass das Arbeiten mit Versionskontrolle einfach und effizient ist. Es erfordert zwar etwas mehr administration, aber die Vorteile überwiegen - sogar wenn Du der Einzige bist, der entwickelt.
Du kannst problemlos mit mehreren Entwicklern an selben Code arbeiten, nicht nur theoretisch und auch innerhalb desselben Source-Files. Letzteres wird aber mit grosser Wahrscheinlichkeit zu Konflikten führen. Aber wie oft arbeiten 2 oder 3 Entwickler an genau demselben File?
SVN (und CVS sowieso) bietet als Backend für das Repository auch das Filesystem an, sodass nicht zwingend ein SQL Server her muss.
Eventuell wären auch verteilte Versionskontrollsysteme wie GIT und MERCURIAL/HG etwas für euch. Die kommen ohne Server aus, haben somit kein zentrales Repository und sind wirklich darauf ausgelegt weltweit an einem Projekt mitarbeiten können (Linux Kernel Entwicklung basiert auf GIT Versionskontrolle). Mit den verteilen Versionskontrollsysteme wärst Du ein Vorreiter. Am weitesten verbreitet ist aktuell SVN.
Gruss, Paolo
|
|
Thema: Automatisch zwei Dezimal stellen anfügen / Abfrage blockieren / Direct Output und Umlaute |
|
|
Hallo Lebowski
Zu 3 kann ich sagen, dass Du den Drucker zuerst konfigurieren musst. Genaugenommen musst Du mindestens dem Drucker sagen, in welchem Zeichensatz die übermittelten Daten codiert sind.
Unter Dataflex (in der IDE) ist das der "Windows-1252"-Zeichensatz, den Du mit einer Escape-Sequenz vorgängig auf dem Drucker wählen musst. Dann kannst Du mit 'write "äöü€" die Zeichen direkt auf den LPT rausschreiben. Das ist natürlich druckerspezifisch, die meisten benutzen aber die PCL Sprache von HP.
|
|
Thema: Aufrufen von Methoden / Ermitteln von Properties innerhalb diverser Klassen |
|
|
Roman
Du brauchst ein Vermittlerobjekt oder du teilst den Instanzen der Klassen den Objekt Handle der jeweils anderen instanz zu. Dazu brauchen die beiden Klassen ein weiteres property.
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
|
class oklasse1 is a...
property handle hoMyConnectedKlasse2
procedure MethodeInKlasse1 parameter1 parameter2
End_procedure
end_class
class oklasse2 is a...
property handle hoMyConnectedKlasse1
end_class
// Instazierung
object o1 is a klasse1
end_object
object o2 is a klasse2
end_object
set hoMyConnectedKlasse2 of oKlasse1 to oKlasse2
set hoMyConnectedKlasse1 of oKlasse2 to oKlasse1
Methodenaufrufe vom Methoden aus Klasse1 können von der Klasse2 so implementiert werden:
send MethodeInKlasse1 of (hoMyConnectedKlasse1(self)) parameter1 parameter2
|
|
Gruss, Paolo
PS: Schau auch die Broadcaster Klasse an...Ein Broadcaster Objekt ist im Prinzip ein Vermittler. Oder bau Dir selber eine Vermittler Klasse/Objekt
|
|
Thema: Version XI Verbindung zur SQL-DB |
|
|
Mit Alias meine ich Datenbanknamen-Aliase welche Du bei SQL Server wie auch bei Oracle definieren kannst. Du kannst damit den Datenbanknamen XY auf einen beliebigen Server Z zeigen lassen.
Wenn Du in deinen Programmen immer XY benutzt, dann musst Du bei allen Clients einen Alias erstellen, der auf den Server Z (oder auch W) zeigt.
Dann kannst Du auf allen Rechnern die Datenbank mit XY ansprechen - unabhängig vom echten Namen Z
Wenns SQLServer ist, probier mal cliconfg.exe - bei oracle wäre die Anpassung im tnsnames.ora.
Gruss, Paolo
|
|
Thema: Version XI Verbindung zur SQL-DB |
|
|
Du könntest auch mit alias arbeiten. Dann kannst Du alle Servernamen durch das alias identisch halten. Ist die Struktur innerhalb der DB auch identisch (Owner/Schema) dann steht dem auch nix im Wege.
Wenn Du mit MSSQL arbeitest, kann es sein, dass der eine Server mit "Windows Authentifizierung" arbeitet und der ander im Mixed Mode "Windows und SQL Authentifiziereung" das kann dazu führen, dass beim ersteren ohne ein User/PW der Zugriff gewährt wird und beim zweiten nicht.
Gruss, Paolo
|
|
Thema: VDF auf UNIX |
|
|
Geb auch noch meine 5cents ab hier.
Du schreibst, dass die Datenfiles auf einem File-Server (NetApp SAN) mit Unix ähnlichem Betriebssystem abgelegt sind. Citrix ist demnach *nicht* direkt am SAN sondern via Netzwerk an einen Fileserver angebunden, der dann am SAN dran ist, korrekt?
Ich denke, dass die Lösung auf der Seite des FILE-Servers gesucht werden muss. Wenn es denn UNIX ähnlich ist (evtl eher LINUX ähnlich?) so besteht die Chance, dass auch standard Module verwendet werden und man somit auch entsprechende Konfigurationen vornehmen kann. Da müsste dir aber der Admin weiterhelfen können.
Am besten ists aber, wenn der Citrix direkt am SAN dran ist.
Gruss
|
|
Thema: Messages an andere Klassen |
|
|
Hallo Roman
Du brauchst einen Vermittler für diese Art der Kommunikation zwischen zwei Klassen resp. deren instanzierte Objekte.
DataFlex bietet Dir die 'broadcaster' Klasse dafür. Ein Objekt dieser Klasse ist in der Lage das zu tun, was Dir vorschwebt. Du kannst Dir aber auch eine eigene Vermittler Klasse/Objekt konstruieren, welches mittels einer definierten Schnittstelle mit den verbundenen Kollegen spricht.
Gruss, Paolo
|
|
Thema: Version VIII VDF 15.1 mit CRW 8.5 (embedded DB) |
|
|
So mal ein Schnellschuss: Du weist explizit darauf hin, dass Du reindiziert hast. Das wäre eigentlich nicht nötig gewesen bei der Migration von VDF7 auf 15 - ausser du hast die collating sequence geändert.
Kann es sein, dass crystal noch mit der alten resp. mit der falschen collating sequence arbeitet? - andererseits: es läuft direkt aus crystal... komisch.
Wirf doch auch den process explorer (sysinternals) an und schau nach welche DLL's der Druckprozess (auf Bildschirm ausgeben) wo anzieht. Eventuell findet nimmt er auf magische Weise eine alte DLL (von 8.5) wenn Du aus der Applikation druckst.
Gruss und viel Erfolg, Paolo
|
|
Thema: dbForm - geänderten Wert auslesen |
|
|
...so richtig verstehe ich Dein Anliegen nicht.
DataFlex kenn auch Makros. Man könnte zum Beispiel eine Befehlsfolge als Makro hinterlegen.
| code: |
1:
2:
3:
4:
5:
|
#COMMAND MachMaHin
showln "ACHTUNG"
send find of !1 !2 !3
showln "FERTIG"
#ENDCOMMAND |
|
Kannst Du dann einfach im Code benutzen
| code: |
1:
|
MachMaHin XXXX 1 1 |
|
(Wobei XXXX das Objekt-Handle ist, das den send Find erhält)
Aber so richtig erwärmen könnte ich mich dafür nicht. Da gibts doch eleganteres...
Gruss, Paolo
|
|
Thema: dbForm - geänderten Wert auslesen |
|
|
der 1te Parameter der Methode "find" ist ein integer. Die erkannten Werte sind sind von 0 bis 7.
lt,le,eq,ge,gt,next_record, first_record,last_record, wobei lt=0 und last_record=7
Du kannst also einen "integer iMode" benutzen und ihn mit z.b. 4 abfüllen und dann mit "send find of XXX iMode 1" den Find ausführen. Dito geht auch für den index (den 2ten Paramter von "send find"
Gruss, Paolo
|
|
Thema: dbForm - geänderten Wert auslesen |
|
|
dbForms welche an einen Server (eine DataDictionary Objekt) gebunden sind, sollte man nur mit den field_* oder file_field_* Methoden bewirtschaften, sei es das Lesen oder auch das Setzen eines Wertes. Das muss grundsätzlich funktionieren - Wenns nicht geht, dann ist irgendwas faul oder falsch verbunden...
Die Werte im DD werden nachgeführt, wenn das Feld verlassen wird.
Es gibt den DataDictionary Inspector, den man innerhalb einer View aufrufen kann und mit dem Du die von den verbundenen DD vorgehaltenen Werte inspizieren kannst. Du siehst auch, welche Objekte (das sind dann die DEO - DataEntry Object) mit dem DDO (DataDictionary Objekt) verbunden sind etc.
Use Dd_debug.dg // im Projekt - dort wo auch die Use XXX.VW sind
Danach solltest Du in der Lage sein, in deinem dbView mittels Ctrl+D den inspector aufzurufen.
HTH, Paolo
|
|
Thema: Datensatz zwieschen 2 WS kopieren |
|
|
Natalia
| Zitat: |
ich soll die Tabellen Kopf1 und Position1 in WS2 anlegen ohne Relation,
dann open WS1\Kopf as Kopf1 und open WS1\Position as Position1 ausführen
und danach haben Kopf1 und Position1 Daten aus WS1?
|
Ja. Du musst aber nicht Tabellen anlegen ohne Relation. Du hast ja im WS2 wie auch im WS1 dieselbe Tabellen(Struktur). Du willst eigentlich eine Datei aus WS1 in WS2 unter 'anderem' Namen öffnen.
Wir sind jetzt im WS2 und wollen KOPF aus WS1 aufmachen:
| code: |
1:
2:
|
open KOPF
open "C:\WS1\DATEN\KOPF.DAT" as KOPF |
|
Jetzt hast Du aber ein Problem: Du willst ja KOPF vom WS2 auch aufmachen. Mit diesem Befehl oben ist aber KOPF als Tabelle des WS1 geöffnet. Ein vorheriger "open KOPF" würde somit überschrieben.
Also: Du kannst eine Tabelle namens KOPF nur einmal öffnen und somit brauchst Du einen weiteren symbolischen Namen für die Datei aus WS1: KOPF1.
Um das zu erreichen brauchst Du einen weiteren Eintrag im Filelist.cfg: KOPF1. Dann sieht der Open so aus:
| code: |
1:
2:
|
open KOPF
open "C:\WS1\DATEN\KOPF.DAT" as KOPF1 |
|
Neues Problem: Es kompiliert nicht, weil er kein KOPF1.FD findet! Also das .FD für KOPF1 erstellen (nur das FD und KEINE Tabellen/DAT).
Solange Du die Relationen nicht gebrauchst (mit relate KOPF1 oder auch mit eine KOPF1.DD), kannst Du damit eigentlich alles machen.
Die obige Lösung hat eben den Nachteil, dass Du einen Filelist Eintrag machen musst, mit Definition von .FD und allenfalls .TAG für KOPF1. Der Vorteil ist, dass Du dann Daten wie gewohnt suchen/bearbeiten kannst (find eq KOPF1 by index.1, move KOPF1.NAME to KOPF.NAME).
Als Alternative kann man auch so vorgehen:
| code: |
1:
2:
3:
|
open KOPF
open "C:\WS1\DATEN\KOPF.DAT" as 400
|
|
Der Nachteil ist, dass KOPF1 nicht existiert und man mit File und Feldnummern arbeiten muss. Vorteil: Kein filelist Eintrag, kein KOPF1.FD etc.
| code: |
1:
2:
3:
|
Clear 400 // Clear KOPF1
set_field_value 400 3 to KOPF.NAME // move KOPF.NAME to KOPF1.NAME (Feld 3)
vfind 400 index.1 EQ // Find eq KOPF1 by index.1 |
|
paolo
PS: Es gäbe da noch die Möglichkeit mit Set_Relate die Relationen umzubiegen, "set_relate position1.kopf_id to kopf1.kopf_id". Dann würde das mit den relationen auch klappen..
|
|
Thema: Für eine Classe |
|
|
Hallo Markus
Language Reference -> Commands -> set_Field_Value
Damit kann auf Buffer-Ebene sowas gemacht werden
| code: |
1:
2:
3:
4:
5:
|
Procedure DoSetzenWert integer iFile integer iField string sWert
set_field_value iFile iField to sWert
End_procedure
|
|
Aufruf:
send DoSetzenWert File_Field Customer.Name "Abraxas"
Gruss, Paolo
|
|
Thema: Datensatz zwieschen 2 WS kopieren |
|
|
Hallo Natalia
| Zitat: |
Wie kann ich jetzt die Tabellen gleichzeitig in WS2 öffnen, so dass Relationen auch funktionieren um DatenSätze von WS1 in WS2 zu kopieren?
|
Öffnen kann man mit "Open AS" jede beliebige Tabelle, sogar ohne Namen "Open c:\temp\customer.dat AS 42". Man muss dann aber mit File und Fieldnumbers arbeiten.
Das mit den Relationen geht nicht. In z.B. OrderDTL Tabelle (im Physischen DAT) steht drin, dass eine Relation zur OrderHea Tabelle besteht, und zwar zum File X, Feld Y. Somit wird ein Relate immer auf File X, Feld Y zugreifen wollen - und nicht auf das mit "Open AS" definiert handle.
| Zitat: |
Was passiert, wenn ich WS1 Tabelle in Filelist WS2 mit anderen Namen eintrage, aber Relation nicht ändere? Wird dann die Relation mit Tabelle in WS1 oder in WS2 verknüpft?
|
Beim finden der Relation greift das System auf das aktive Filelist.cfg zu. Wie schon gesagt: Die Relation ist Fix im DAT drin und zeigt auf eine bestimmte Filen- und Fieldnumber.
| Zitat: |
z.B.: WS1: Kopf <-Position
WS2: Kopf<-Position, Kopf1(File aber aus WS1), Position1 (File aber aus WS1).
Wenn ich ein Datensatz in POSITION1 finde, welche Kopf bekomme ich dann?
Aus Kopf(WS2) oder aus Kopf1(also WS1).
Kann ich in WS2 Kopf1 und Position1 ohne verknüpfung mit WS1 anlegen und dann mit "Open as" aus WS1 Tabellen aufmachen? Wie funktioniert es richtig?
|
Das einfachsten ist es, Du arbeitest mit open as, vergisst die bestehenden Relationen (also die die DD-Builder definiert wurde) und programmierst die Relationen aus (clear/move/find eq). Wenn die Daten ziemlich statisch sind und auch mengenmässig nicht übertrieben, könntest Du Dir auch überlegen die Daten periodisch in den gewünschten Workspace zu kopieren (Tabellen und sogar nur ins memory/array) und eventuell zu denormalisieren.
HTH, Paolo
|
|
Thema: Tausenderpunkt (1.000,00) im Grid |
|
|
Ralf
hier eine Auswahl...Ich gehe davon aus dass Du mit der Klasse "GRID" arbeitest. Die items entsprechen der Spalte (0-basierz)
Gruss, Paolo
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
|
Set form_datatype item 0 to ascii_window
Set form_datatype item 1 to mask_numeric_window
Set Numeric_mask item 1 to 6 0 "*" // Numerisch 6.0 ohne Tausender
Set form_datatype item 2 to ascii_window
Set form_datatype item 3 to mask_numeric_window
Set Numeric_mask item 3 to 6 0 "*"
Set form_datatype item 4 to mask_numeric_window
Set Numeric_mask item 4 to 8 2 ",*" // NUmerisch 8.2 mit Tausender
Set form_datatype item 5 to mask_date_window
Set form_datatype item 6 to mask_date_window
Set form_datatype item 7 to mask_date_window
|
|
|
|
Thema: Wie installiert man eine Clientversion richtig im Netz? |
|
|
Hallo Roman
Unsere Installationen sind alle auf dem Netz, manuell ohne setup und auch one den Client-Installer von DAC. Das einzige was wir machen ist ein LNK File sowie die Registrierung der ActiveX Komponenten pro Workstation.
Grundsätzlich kriegst Du VDF so hin, dass Du, abgesehen von der Registrierung allfälliger AcitveX Komponenten, keinerlei Registry Einträge tätigen musst.
Ein VDF Executable braucht die Runtime um ausgeführt zu werden (Bsp. vdfvm14.dll plus einige andere Files). Das EXE sucht beim Start einen bestimmten registry Eintrag in HKLM (den VDFRootDir in den Defaults). Wenn das EXE diesen Eintrag nicht findet, so sucht das Exe nach der Runtime im Current Dir (das Dir in dem das Exe gestartet wurde resp. das Dir das in einem Link als Current Dir angegeben wird). Das kannst Du Dir zu nutze machen.
Versuche mal folgendes (sollte für VDF14 klappen)
- Mache eine Client installation auf das Netzwerk
- Stelle sicher, dass auch der DbExplorer.exe im BIN Verzeichnis der Runtime ist (oder auch Flexerrs.exe)
- Stelle sicher, dass termlist.cfg und das korrekte *.dfr file im BIN der Runtime ist
- Prüfe register.ini im BIN der Runtime, dass es auf das Current Directory (".\") zeigt (das BIN der Runtime)
- Prüfe die Benutzerberechtigungen (zuerst mal schreibrechte an alle)
- gehe zu einem anderen Rechner und versuche mal den DbExplor zu starten. Dabei ist sollte es völlig wurscht sein, obs via UNC oder Laufwerk bezeichnung versuchst
Eigentlich sollte der DbExplor starten und nach einem Workspace fragen. Solltest Du ActiveX Fehler Kriegen, so starte mal das "RegisterCodejockControls.bat" auf dem Rechner...
Und sonst sehen wir uns an der EDUC, oder?
Gruss, Paolo
|
|
|
|