Hochschule Harz FB Automatisierung und Informatik
3. Übung Programmierung in ArcView
1. Aufgabe
Erstellen Sie ein Script im Tabellenmodus mittels eines Schalters. Als Aufgabe soll eine laufende Nummerierung in ein Feld eingetragen werden
Hinweise:
1) Die Bezeichnung soll mittels Inputbox eingelesen werden.
2) Mit folgenden Anweisungen kann die „Tabelle“ addressiert werden.
theTable = av.GetActiveDoc // aktuelle Dokument, die Tabelle theVTab = theTable.GetVTab // Zugriff auf die Spalten
theTable.StopEditing 3) Methoden der Klasse VTab
findfield
4) Anlegen eines Feldes theVTab.setEditable(true)
feld = Field.Make(sNr, #FIELD_DECIMAL, 16, 0) feld.SetVisible( TRUE )
theVTab.AddFields({feld})
5) Setzen eines Wertes (Zelle) in der Tabelle theVTab.SetValue(myfield, aRec, 44)
2. Aufgabe
Erstellen Sie ein Script im Tabellenmodus mittels eines Schalters. Als Aufgabe soll eine Zufallszahl in ein Feld eingetragen werden. Dabei soll das Feld mittels einer Liste ausgewählt werden. Es können natürlich nur numerische Felder verwendet werden.
Hinweise:
1) Der Maximalwert soll mittels Inputbox eingelesen werden.
Dabei soll aber eine Überprüfung auf einen gültigen numerischen Wert stattfinden. Die Klasse
„Number“ liefert dazu Ihnen Informationen.
2) Das Feld soll mittels Liste ausgewählt werden.
Dabei können natürlich nur numerische Felder angezeigt werden. Falls kein Feld existiert, soll eine Fehlermeldung angezeigt werden.
3) Berechnung
Folgende Anweisungen erlaubt den Zugriff auf die Markierungen.
theBitMap = theVTab.GetSelection theBitmap.clearAll
expr = "( 123)"
MsgBox.Info(expr,"expr")
theVTab.Calculate(expr, myFeld4711) theVTab.UpdateSelection
3. Aufgabe
Erstellen Sie ein Script im Tabellenmodus mittels eines Schalters. Als Aufgabe soll das Script aus einem Feld einen Teilstring ausschneidet und in einem anderen Feld eintragen.
Vorgehensweise:
Auswählen des Quellfeldes (Nur Charakterfelder)
Auswählen des Zielfeldes (Nur Charakterfelder, aber ohne Quellfeld)
Eingabe der beiden Positionen mittels einer MultiInput-Eingabe (siehe Seite 25)
Query programmieren Ablauf:
Tabelle mit zwei zusätzlichen Spalten
Aufruf des Scriptes, Auswahl des Quellfeldes
Auswahl des Zielfeldes
Bereich bestimmen
Ausdruck in der Query
Ergebnis
Hinweise:
1) Sie müssen erst die zwei Felder anlegen und mit Werten füllen.
Oder das Shape von meiner Homepage laden.
2) Verwenden Sie die Methode Number.Middle
Lösungen
'Aufgabe1 sNr="Nr"
sNr = MsgBox.Input ( "Eingabe des Feldnamens","Laufende Nummer eintragen", sNr) if (sNr=nil) then
exit end
theTable = av.GetActiveDoc theVTab = theTable.GetVTab
theTable.StopEditing
feldsNr = theVtab.FindField(sNr) if (feldsNr=nil) then
theVTab.setEditable(true)
feld = Field.Make(sNr, #FIELD_DECIMAL, 16, 0) feld.SetVisible( TRUE )
theVTab.AddFields({feld}) feldsNr = theVtab.FindField(sNr) end
theVTab.setEditable(true)
theBitMap = theVTab.GetSelection theBitmap.clearAll
i=0
for each rec in theVtab i=i+1
theVTab.SetValue(feldsNr,Rec,i) end ' for
theVTab.setEditable(false) theVTab.UpdateSelection
' HSHARZ.BnTableRandom '
sMax="100"
sMax = MsgBox.Input ( "Eingabe des Maximalwert","Zufallszahlemn eintragen", sMax) if (sMax=nil) then
exit end
if (sMax.isNumber.not) then
MsgBox.Info("Bitte tragen Sie einen gültigen Wert ein","Hinweis") exit
end
theTable = av.GetActiveDoc theVTab = theTable.GetVTab
theTable.StopEditing myList = LIST.Make
theFields = theVTab.GetFields ' getActiveField for each aFeld in theFields
if (aFeld.IsTypeNumber) then myList.add(aFeld)
end end
if (myList.count=0) then
MsgBox.Info("Bitte tragen Sie ein Dezimalfeld in Ihre Tabelle","Hinweis") exit
end
myFeldRandom = MsgBox.list(myList,"Zufalls-Attribut","Auswahl") if (myFeldRandom=nil) then
exit end
' Number.makeRandom(1,100)
theVTab.setEditable(true)
theBitMap = theVTab.GetSelection theBitmap.clearAll
expr = "( Number.MakeRandom(1,"+sMax.asString+") )"
MsgBox.Info(expr,"expr")
theVTab.Calculate(expr, myFeldRandom) theVTab.UpdateSelection
theVTab.setEditable(false)
' HSHARZ.BnTableMiddle '
theTable = av.GetActiveDoc theVTab = theTable.GetVTab
theTable.StopEditing myList = LIST.Make
theFields = theVTab.GetFields ' getActiveField for each aFeld in theFields
if (aFeld.IsTypeString) then myList.add(aFeld)
end end
if (myList.count=0) then
MsgBox.Info("Bitte tragen Sie ein Dezimalfeld in Ihre Tabelle","Hinweis") exit
end
myFeldQuelle = MsgBox.list(myList,"Quell-Attribut","Auswahl") if (myFeldQuelle=nil) then
exit end
' myFeldQuelle löschen
myList.RemoveObj ( myFeldQuelle )
myFeldZiel = MsgBox.list(myList,"Ziel-Attribut","Auswahl") if (myFeldZiel=nil) then
exit end
' Erste Liste mit den Labels
indizes = { "Startindex", "Endindex" } ' Zweite Liste mit den Defaultwerten defaults = { "1", "4" }
' Aufruf der Eingabe
zahlen = MsgBox.MultiInput( "Auschneiden", "Nummern", indizes, defaults ) ' Erneute Ausgabe ?
if (zahlen.count =0) then exit
end
sStart = zahlen.get(0) sEnd = zahlen.get(1) if (sStart.IsNumber.not) then
Msgbox.Info("Bitte eine gültige Start-Zahl eintragen", "Hinweis") end
if (sEnd.IsNumber.not) then
Msgbox.Info("Bitte eine gültige End-Zahl eintragen", "Hinweis") end
iStart = sStart.asNumber iEnd = sEnd.asNumber if (iStart>iEnd) then
Msgbox.Info("Die Startzahl muss kleiner gleich der Endzahl sein", "Hinweis") end
theVTab.setEditable(true)
theBitMap = theVTab.GetSelection theBitmap.clearAll
n = iEnd-iStart+1
expr = "( ["+ myFeldQuelle.asString+"].Middle(" + iStart.asString+","+n.asString+") )"
MsgBox.Info(expr,"expr")
theVTab.Calculate(expr, myFeldZiel) theVTab.UpdateSelection
theVTab.setEditable(false)