Gelegentlich ist es nötig über alle Komponenten eines mx:Canvas-Elements, einem Container oder einer UIComponent zu iterieren.
Beispiele:
* Deaktivieren von allen Controls eines bestimmten Typs (alle Textfelder ausgrauen)
* Neuschriftung von allen Labels
* Deaktivieren aller Reiter
Ansatz
Durch den Typecast in einen DisplayObjectContainer lässt sich über jedes UI-Element iterieren. Eine Startmethode übergibt das Canvas, bzw. das UI-Urelement. Die Rekursionsmethode castet in den kompatiblen Supertyp DisplayObjectContainer und verfügt über Möglichkeiten der Iteration über seine Eigenschaften.
Lösung
// Startmethode übergibt Urelement der Rekursion
public function startSearch():void
{
searchRecursion(this);
}
// Rekursionsmethode ruft sich selbst auf wenn Child-Elemente v.h.
public function searchRecursion(current:DisplayObjectContainer):void
{
for ( var i:Number=0; i< current.numChildren; i++)
{
var child:DisplayObject = current.getChildAt(i);
trace(getQualifiedClassName(child));
var childContainer:DisplayObjectContainer = child as DisplayObjectContainer;
if(childContainer)
{
searchRecursion(childContainer);
}
}
}
[/javascript]
Für die Steuerung kabelloser Geräte (wie z.B. Elektromotoren) wird eine programmierbare, batteriebetriebene Lösung gesucht, die Eingabewerte von Sensoren annehmen und verarbeiten kann.
Ansatz
Durch die Verwendung des programmierbaren Arduino-Boards (arduino.cc) können Motoren mit niedriger Spannung bis zu 5 Volt betrieben werden.
Lösung
Projekt 1: Infrarotsensor
Projekt 2: Entfernungsmesser
Zusammenstellung des Roboters (Projekt 1)
Die folgenden Hardware-Komponenten werden benutzt:
Tamiya Track&Wheel Set
Tamiya Twin-Motor Gear Box (Motorkonfiguration: Type C)
Platine DFRobotShop Rover
Arduino Duemilanove; Prozessor ATMega 328
integrierter Motorcontroller (besetzt Pins 5-8)
USB Schnittstelle
Battery-Fach
Infrarotsensor: DFR0094
Zusammenstellung des Roboters (Projekt 2)
Die folgenden Hardware-Komponenten werden benutzt:
Tamiya Track&Wheel Set
Tamiya Twin-Motor Gear Box (Motorkonfiguration: Type C)
Platine DFRobotShop Rover
Arduino Duemilanove; Prozessor ATMega 328
integrierter Motorcontroller (besetzt Pins 5-8)
USB Schnittstelle
Battery-Fach
IR Range Sensor: SHARP GP2D12 IR Ranger Sensor
Verdrahtung des Roboters (Projekt 1)
Infrarotsensor:
Arduino 5V wird an VCC des Sensors angeschlossen
Arduino GND an Infrarotsensor GND
D wird (hier in meinem Code) auf Digital Pin 11 gelegt
Die folgenden Software-Komponenten werden benutzt:
IDE von Arduino CC
Infrarot-Bibliothek: IRremote.h
Verdrahtung des Roboters (Projekt 2)
Infrarotsensor:
Arduino 5V mit IR Ranger Sensor roter Draht verbinden
Arduino GND mit IR Ranger Sensor schwarzer Draht verbinden
Arduino A2 analoger Eingang mit grünem Draht verbinden
Die folgenden Software-Komponenten werden benutzt:
IDE von Arduino CC
Mein Code (Projekt 1)
#include <IRremote.h> // use the library
int E1 = 6; //M1 Speed Control
int E2 = 5; //M2 Speed Control
int M1 = 8; //M1 Direction Control
int M2 = 7; //M2 Direction Control
int receiver = 11; // pin 1 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;
void setup()
{
int i;
for(i=5;i<=8;i++)
pinMode(i, OUTPUT);
Serial.begin(9600); // for serial monitor output
irrecv.enableIRIn(); // Start the receiver
}
void loop()
{
if (irrecv.decode(&results)) // have we received an IR signal?
{
Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
int leftspeed = 255; //255 is maximum speed
int rightspeed = 255;
switch(results.value)
{
case 0x802:
{
forward (leftspeed,rightspeed);
}
break;
case 0x804:
{
left (leftspeed,rightspeed);
}
break;
case 0x806:
{
right (leftspeed,rightspeed);
}
break;
case 0x808:
{
reverse (leftspeed,rightspeed);
}
break;
default:
stop();
break;
}
irrecv.resume(); // receive the next value
} // Your loop can do other things while waiting for an IR command
}
void stop(void) //Stop
{
digitalWrite(E1,LOW);
digitalWrite(E2,LOW);
}
void forward(char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,LOW);
analogWrite (E2,b);
digitalWrite(M2,LOW);
}
void reverse (char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,HIGH);
analogWrite (E2,b);
digitalWrite(M2,HIGH);
}
void left (char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,HIGH);
analogWrite (E2,b);
digitalWrite(M2,LOW);
}
void right (char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,LOW);
analogWrite (E2,b);
digitalWrite(M2,HIGH);
}
[/javascript]
<h3>Mein Code (Projekt 2)</h3>
[javascript]
// example 32.1 - IR receiver code repeater
// http://tronixstuff.com/tutorials > chapter 32
// based on code by Ken Shirriff - http://arcfn.com
int E1 = 6; //M1 Speed Control
int E2 = 5; //M2 Speed Control
int M1 = 8; //M1 Direction Control
int M2 = 7; //M2 Direction Control
int irReader = 3; // the analog input pin for the ir reader
int irVal = 0; // stores value from Ir reader
void setup()
{
int i;
for(i=5;i<=8;i++)
pinMode(i, OUTPUT);
Serial.begin(9600); // for serial monitor output
}
void loop()
{
int leftspeed = 255; //255 is maximum speed
int rightspeed = 255;
irVal = analogRead(irReader); // read the value from the ir sensor
Serial.println(irVal); // sends ir val to computer
if (irVal>210) // have we received an IR signal?
{
left (leftspeed,rightspeed);
delay(500);
}
else
{
forward (leftspeed,rightspeed);
}
}
void stop(void) //Stop
{
digitalWrite(E1,LOW);
digitalWrite(E2,LOW);
}
void forward(char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,LOW);
analogWrite (E2,b);
digitalWrite(M2,LOW);
}
void reverse (char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,HIGH);
analogWrite (E2,b);
digitalWrite(M2,HIGH);
}
void left (char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,HIGH);
analogWrite (E2,b);
digitalWrite(M2,LOW);
}
void right (char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,LOW);
analogWrite (E2,b);
digitalWrite(M2,HIGH);
}
Es soll nun mit einer Art Split/Explode wie in PHP die Spalte aufgesplittet werden und einzelne Werte ausgegeben werden
Ansatz
Der folgende Code erstellt eine Funktion, die für eine Datenbank gilt. Kopiert man diesen Code in das SQL Server Management Studio und führt ihn mit F5 aus, erhält die ausgewählte Datenbank die Funktion Split.
Lösung
CREATE FUNCTION [dbo].[split](@String varchar(8000), @Delimiter varchar(12),
@returnItem int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @id int
DECLARE @idx int
DECLARE @slice varchar(8000)
DECLARE @returnslice varchar(8000)
SET @id = 0
SET @idx = 1
SET @returnslice = null
WHILE @idx!= 0
BEGIN
SET @id = @id + '1'
SET @idx = charindex(@Delimiter,@String)
IF @idx!=0
SET @slice = left(@String,@idx - 1)
ELSE
SET @slice = @String
IF @id = @returnItem SET @returnslice = @slice
SET @String = SUBSTRING(right(@String,len(@String) - @idx),
len(@Delimiter), len(@String))
IF len(@String) = 0 BREAK
END
RETURN @returnslice
END
Aus einem normalen SQL Statement, welches mit EXEC ausgeführt wird, soll eine Ergebnisvariable in dem „normalen“ TSQL-Skript weiterverwendet werden.
Ansatz
Hierzu wird der Rückgabewert des EXEC Statements in eine Variable geschrieben.
Lösung
SET @sql2='SELECT COUNT(*) FROM users WHERE ['+@forsheet+']=1'
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'ResultSet')
DROP TABLE ResultSet;
CREATE TABLE ResultSet (mycount int)
INSERT INTO ResultSet
EXEC sp_executesql @sql2
SELECT @isdrin=mycount FROM ResultSet
Die Datei librfc32.dll muss im VBA Editor eingebunden werden (sie ist nach der Installation der SAPGUI verfügbar).
Lösung
Aufbau der Verbindung
Public Function SAP_Logon(username As String, password As String) As Boolean
'*************************************************
' ANMELDUNG AN SAP
' ACHTUNG: USER MUSS BERECHTIGUNGEN HABEN!!!!
'*************************************************
Set FunctionCtrl = CreateObject("SAP.Functions")
'Objekt für die SAP Verbindung
Set SapConnection = FunctionCtrl.Connection
SapConnection.Client = "100"
SapConnection.User = username
SapConnection.Language = "DE"
SapConnection.password = password
SapConnection.hostname = "rechnername.firma.com" 'nicht das kuerzel wie DE9
SapConnection.systemnumber = "0"
If Not SapConnection.Logon(0, True) Then 'True silent - false offen
MsgBox "Logon failed!!!", vbCritical
CMS_Logon = False
Else
CMS_Logon = True
End If
End Function
Abmelden
Public Function SAP_Logoff() As Boolean
SapConnection.LogOff
End Function
Funktionbaustein befüllen und aufrufen
Public Function SAP_Create_Request() As Long
'******************************************************
' Request erzeugen
' Strukturen füllen und übergeben, dann Log ausgeben
'******************************************************
On Error GoTo ErrorMSG
Dim FunctionModule As Object
Dim e_EXPORTSTRUKTUR As Object
Dim T_TABELLENSTRUKTUR As Object
Dim te_messtab As Object
Dim lCnt As Long
' Assign Function Module
Set FunctionModule = FunctionCtrl.Add("Z_FUBA")
' Set export Variables
Set e_EXPORTSTRUKTUR = FunctionModule.Exports("P_STRUKTURPARAMETER")
' Set structrue fields in export parameter
e_EXPORTSTRUKTUR ("ZEXPORTPARAM1") = "BLA"
e_EXPORTSTRUKTUR ("ZEXPORTPARAM1") = "BLA2"
Set T_TABELLENSTRUKTUR = FunctionModule.Tables("T_ZMMMATANF8")
T_TABELLENSTRUKTUR.appendRow
T_TABELLENSTRUKTUR(1, "SPALTE1") = 1
T_TABELLENSTRUKTUR(1, "SPALTE2") = 2
T_TABELLENSTRUKTUR.appendRow
T_TABELLENSTRUKTUR(2, "SPALTE1") = 3
T_TABELLENSTRUKTUR(2, "SPALTE2") = 4
' Call Function Aufruf
If FunctionModule.Call = True Then
Set te_messtab = FunctionModule.Tables("TE_MESSTAB")
' Meldungen ausgeben:
Dim intRow As Integer
For intRow = 1 To te_messtab.RowCount
If te_messtab(intRow, "ARBGB") = "ZMM0001" And _
te_messtab(intRow, "MSGNR") = "003" Then
' ANForderung wurde erstellt.
CMS_Create_Request = Val(te_messtab(intRow, "MSGV1"))
End If
Debug.Print te_messtab(intRow, "ARBGB")
Debug.Print te_messtab(intRow, "MSGNR")
Debug.Print te_messtab(intRow, "NATXT_DE")
sMSGTXT = te_messtab(intRow, "NATXT_DE")
Debug.Print te_messtab(intRow, "FLDNAME")
Debug.Print te_messtab(intRow, "MSGV1")
Debug.Print te_messtab(intRow, "MSGV2")
Debug.Print te_messtab(intRow, "MSGV3")
Debug.Print te_messtab(intRow, "MSGV4")
Debug.Print "----------------------------------"
Next
Else
CMS_Create_Request = 0
MsgBox "Error creating the CMS Request." & vbNewLine & _
"See Log for details", vbCritical
End If
ErrorMSG:
End Function
Die Testfunktion
Public Sub Start()
'*************************************************
' TESTUMGEBUNG
'*************************************************
Dim RequestNo As Long
Dim username As String
Dim password As String
username = "BJOERN"
password = "ICHBINDERBESTE"
Call CMS_Logon(username, password)
RequestNo = SAP_Create_Request
Call CMS_Logoff
End Sub
Für die Ansteuerung externer Elektronikgeräte wird eine programmierbare Lösung gesucht, die auch kabellos per Batterie betrieben werden kann und Eingabewerte (z.B. Sensorwerte) einlesen kann.
Ansatz
Die Verwendung eines Mikrocontrollers ist notwendig. Mikrocontroller sind sehr stromsparende, programmierbare und mobile Systeme, die nur das nötigste an Anschlüssen für das Aufbauen komplexer Elektronikschaltungen besitzen.
Lösung
Auf die Empfehlung eines Elektronikfreaks habe ich mir das Arduino Uno zugelegt. Hierbei handelt es sich um ein programmierbares Board mit 1KByte Flash-Speicher und einer ATMega Prozessor.
Beurteilung
Da man auf einer sehr niedrigen Ebene mit Bauteilen arbeitet, würde sich ein Elektrotechnikgrundkurs anbieten.
Es soll ein Din A5 Faltheftchen mit Adobe InDesign erstellt werden, welches auf dem Heimdrucker ausgedruckt werden kann.
Voreinstellungen
Zunächst wird ein Dokument mit den Maßen für Din A5 (Document Setup) erstellt:
Problem 1
Als erstes muss klar sein, das ein A5 Heftchen aus gefalteten DIN A4 Blättern besteht. Jedes DIN A4 Blatt wird beidseitig bedruckt und bietet Platz für 4 DIN A5 Seiten.
Lösung 1
Also sollte die Seitenanzahl durch 4 teilbar sein, bevor man druckt, damit man nicht anfangen muss zu kleben und zu basteln. Ein Dokument hat idealerweise eine Seitenzahl von n=4*x (x:DIN A4 Blätter). Unbenutzte Seiten können mit Bildchen und anderen Platzauffüllern besetzt werden.
Problem 2
Viele Drucker haben keine Duplex-Einheit für den beidseitigen Druck.
Lösung 2
Hierfür muss eine Treibereinstellung des Druckertreibers genutzt werden (beidseitiger Druck auf manuell), der zunächst alle ungeraden Seiten druckt, und danach auffordert den Papierstapel erneut wie gedruckt (mit der Schrift nach oben) einzulegen. Das Betätigen des Weiter-Buttons druckt anschließend die geraden Seiten aus.
Hierfür empfehle ich die normale Print-Option (nicht Print Booklet) zu verwenden. Es muss lediglich auf die Seitenzahl (Problem 1) geachtet werden und leere Seiten mit Platzhaltern aufgefüllt werden.
Beispiel-Dokument
Folgendes Kirchenheft wurde mit 8 Seiten mit InDesign CS4 erstellt und als DIN A5-Booklet über die normale Print-Option gedruckt: Beispiel Dokument
Eine Tabelle soll gelöscht werden wenn sie existiert.
Problem
Nutzt man in einem TSQL-Skript den DROP Table Befehl (z.B. in einer Stored Procedure) erhält man eine Fehlermeldung, das die zu löschende Tabelle nicht existiert. In einigen Fällen führt dies zum Abbruch des Skriptes.
Ansatz
Über das META-Schema vom MS SQL Server lässt sich erfragen, ob eine Tabelle existiert.
Lösung
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'users')
DROP TABLE users;
In einer Spalte mit Materialnummer/Artikelnummern werden bei allen numerischen Materialnummern die Nullen entfernt, alphanumerische Materialnummern bleiben unberührt. Soll auch bei den alphanumerischen Materialnummern die führenden Nullen entfernt werden, verweise ich auf den Artikel in der Rubrik „MS SQL Server: Führende Nullen bei alphanumerischem String“.
Ansatz
Über das Case Statement wird gefragt ob der Artikel numerisch ist. Ist er numerisch, wird über die Konvertierung in einen Integer (und anschließendes Zurückkonvertieren in VARCHAR) die führenden Nullen entfernen.
Lösung
Microsoft SQL Server:
UPDATE tabelle SET material=
CASE WHEN isnumeric(material)=1
THEN convert(VARCHAR, convert(INTEGER, material))
ELSE convert(VARCHAR, material)
END
Microsoft Access:
UPDATE articletexts SET material=
IIF(IsNumeric(material),
REPLACE(LTRIM(REPLACE(material,'0',' '))
,' ','0'), material)