Zeit kanal ändern im Report
Hallo,
ich habe ein Diagramm eingebaut. X achse ist Zeit, Y achse ist Temperatur. Jetzt möchte ich die x-zeit um Strecke ändern, aber Y achse ist beihaltet.Ich habe schon die Funktion Kurven und Achsen Definition versucht, einhiet und X kanal geändert. Nicht klappt. Kann jemand mir dabei helfen? Vielen Dank!
Gruß
Andreas
Solved!
Go to Solution.
Geht es um die Skalierung der x-Werte? d.h. statt Bereich 3:00 - 3:15 lieber den Bereich 3:25 - 3:50 anzeigen lassen?
Dann hilft ein Doppelklick auf die x-Achse und in der sich öffnenden Dialogbox 'Kurven- und Achsendefinition' im Reiter 'Achsenparameter' die Skalierung von x manuell zu verändern.
War's das, was du meintest?
Gruß
MiC
Similar Messages
-
Zeit-Kanal mit Numerischem-Kanal addieren
Hallo,
ich würde gerne einen Zeit-Kanal (Datum und Uhrzeit) mit einem Numerischem-Kanal (Sekunden) addieren. Also die Sekunden zu der Uhrzeit dazu addieren.
Bzw. eine neue Spalte generieren: Ich habe eine Spalte mit Datum und Uhrzeit mit z.B. 2 Zeilen also zwei Daten mit Uhrzeiten. Und eine Spalte mit z.B. 10 Zeilen, in der die Sekunden von 1 bis 10 stehen.
z.B. 30.10.2013 10:15:05 1
30.10.2013 10:15:10 2
3
10
In der neuen Spalte möchte ich dann sagen, dass die ersten 5 Sekunden plus der ersten Zeitangabe (Datum und Uhrzeit) = 1 und dann automatisch Zeitangabe zwei plus die nächsten 5 Sekunden = 2
Wie kann ich das am besten Umsetzen? Und wie müssen meine Daten dafür vorliegen auch bzgl. der verschiedenen Formatierungen?
Würde mich sehr über eure Hilfe und Antworten Freuen
Viele Grüße
SabrinaHi Brad,
im Anhang habe ich einen Bsp-Datensatz mit 3 Zyklen angehängt:
In der Spalte "Datum/Zeit" steht der Startzeitpunkt der Zyklen. Alle Zyklen haben jeweils eine Dauer von 5 sec. Und pro Zyklus gibt es z.B. 5 Kraft- und Wegmessungen. In der Spalte "dt" steht die Zeit in sec.
Ich habe eine Graphik erstellt (Raumkurve) mit der Kraft, dem Weg und allen 3 Zyklen hintereinander. Aber anstatt der Zeitachse (dt) möchte ich die Zyklusnummer (1 bis 3) stehen haben.
Vielen Dank!!!
Sabrina
Attachments:
BspDaten.xls 27 KB -
Anzeigeformat des Kanals ändern
Hallo,
ich benutze DIAdem seit kurzem und brauche hilfe bzw. Tipps um weiter zu kommen.
In einem Kanal (Anzeigeformat: numerisch / Datentyp: Float64 ) möchte ich Werte, die ich in HEX konvertiere, im selben Kanal speichern.
dazu-----> temp = "AB01"
Variable1=Mid(temp,1,2)
Variable2=Mid(temp,3,2)Hallo Youssef!
Jetzt ist es schon fast klar. Ich hab nur noch ein Verständnisproblem damit das deine Konvertierung unabhängig von der Bytezahl zu sein scheint. Ist das so richtig? Erweitert man dein Beispiel noch um eine Zeile mit dem Wert 1 ergibt sich folgende Liste:
1 -->> HEX(1) = 01 --->> 01 01000000
33846 -->> HEX(33846) = 8436 --->> 3684 36840000
5243146 -->> HEX(5243146) = 50010A --->> 0A0150 0A015000
Die blauen Werte wären die m.E. bei 4 Byte sich ergeben müssen.
So nun zum Lösungsansatz. Ist erstaunlich umfangreich und ggf. noch nicht perfekt. Es gibt auch mindestens zwei Lösungen. Ich hab mal die etwas einfachere reingestellt, sollte die Performance nicht reichen muss man einen etwas anderen Weg gehen. Die Anzahl der Bytes hol ich mir über die Kanaleigenschaft 'CANNoOfBits'. Die Erklärung des Codes ist in den Kommentaren:
Option Explicit
' Ergebnisgruppe erstellen (wenn vorhanden vorher löschen
If GroupIndexGet("Ergebnis") > 0 Then
Call GroupDel( GroupIndexGet("Ergebnis") )
End If
Call GroupCreate("Ergebnis")
Call GroupDefaultSet( GroupIndexGet("Ergebnis") )
' Konvertierung der beiden Kanäle
Call Convert("SWA/Data_SWA")
Call Convert("SWA/var_SWA")
' Konvertierungsfunktion, Übergabeparameter ist der vollqualifierte Kanalname
Function Convert(ByRef sgSource)
Dim i
Dim j
Dim s
Dim nChn
Dim nChnHex
Dim sgHex
Dim nBytes
' Kanalnummer des Quellkanals bestimmen
nChn = CNo(sgSource)
' Ergebnistexkanal mit gleichem Namen anlegen
Call ChnAlloc(ChnName(nChn),ChnLength(nChn),1,DataTypeString,"Text")
' Kanalnummer des Ergebnistextkanals ermitteln
nChnHex = CNo("Ergebnis/" & ChnName(nChn))
' Anzahl Bytes bestimmen
nBytes = ChnPropValGet(nChn, "CANNoOfBits") / 8
' Umwandlung in einer Schleife über alle Werte (ggf. nicht performant!)
For i=1 To ChnLength(nChn)
' Wert in HEX-String umwandeln
sgHex = Hex( ChdX(i,nChn) )
' ggf. mit führenden Nullen auffüllen
sgHex = String(nBytes*2-Len(sgHex),"0") & sgHex
' Bytereihenfolge umkehren
s = ""
For j=0 to nBytes
s = Mid(sgHex,j*2+1,2) & s
Next
' neu zusammengesetzt in einen Textkanal speichern
ChT(i,nChnHex) = s
Next
End Function
Sollte was unklar sein bitte nachfragen.
Matthias
Message Edited by Twigeater on 09-30-2008 11:01 PM
Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater? -
Media:connect App spielt nicht mehr ab
Nach update meines ipad3 auf ios6 kann ich über App. Media:connect keine Videos meiner internen Loewefestplatte mehr abspielen. Videos werden erkannt, sind aber nicht mehr abspielbar. Wer kann helfen? Außerdem trotz diverser Versuche - Zeit/Datum ändern, App.-Store an-/abmelden - immer wieder Fehlermeldungen bei Anmeldung im App.-Store.
Please post Photoshop Elements related queries over at
http://forums.adobe.com/community/photoshop_elements -
Hallo zusammen,
ist es möglich, die Kanal Eigenschaft "Status" von "readonly" auf "read" oder "eingelesen" zu ändern? Ich habe einen Zeitkanal, den ich deswegen nicht verarbeiten kann!
Vielen Dank!
SebastianHallo Sebastian,
kann es sein das es sich bei diesem Kanal um einen "impliziten" Kanal handelt? Ein impliziter Kanal ist nicht wirklich in der Datei abgespeichert, sondern durch einen Startwert, eine Schrittweite und die Anzahl der Werte definiert. Erkennen kann man implizite Dateien an dem kleinen "i" im Symbol "123" im Datenportal ...
Um einen impliziten Kanal in einen "normalen" Kanal umzewandeln muss man (durch einen Rechtsklick auf den Kanalnamen) im Kontextmenue die Funktion "Kanal expandieren" (oder so aehnlich, meine Oberflaeche ist in Englisch - dort heisst es "Expand channel") benutzen. Danach solltest Du den Kanal beliebig bearbeiten koennen (also auch auf "read" oder "eingelesen"aendern).
Ich hoffe das hilf weiter.
Gruss,
Otmar
Otmar D. Foehner
Business Development Manager
DIAdem and Test Data Management
National Instruments
Austin, TX - USA
"For an optimist the glass is half full, for a pessimist it's half empty, and for an engineer is twice bigger than necessary." -
Report - Winkel auf X-Achse - skalieren / Ursprung ändern
Hallo,
also mein Anliegen ist eigentlich ganz einfach, aber ich tue mich etwas schwer es in Worte zu fassen.... =)
Also ich habe 2 Kanäle. Im ersten sind die Y Werte, im zweiten die zugehörigen X Werte. Die X Werte sind Winkel, also theoretisch von 0° bis 360°.
Nun gibt es Kurven, die z.B. von 300° bis 50° laufen.
Jetzt möchte ich diese auf einem Diagramm darstellen in der Art, dass die X-Achse bei sagen wir mal 250° (linkes Ende) beginnt und bei 100° endet (rechtes Ende). Also in der Mitte bis 360° geht und dann wieder bei 0° weiter macht.
Alles was ich hin bekomme ist aber eine X-Achse, die bei 0° anfängt und bis 360° geht. Und meine Kurve ist dann in zwei Teile "zerhackt", der erste Teil von 0° bis 50° ganz links und der Rest zwischen 300° und 360°.
Hat da jemand eine Idee?
Ich könnte in dem beschriebenen Beispiel die X Werte für 300° bis 360° in -60° bis 0° umrechnen, dann geht meine Kurve im Diagramm von -60° bis 50° und wäre wenigstens zusammenhängend, aber die X-Achse wäre dann faktisch einfach falsch beschriftet.
Das muss doch irgendwie korrekt darzustellen sein?Hallo NaniB,
wenn die 0 in der Mitte liegen soll, dann muss links ein negativer Wert stehen.
Bedeutet hier bei einer Kurve von 300° bis 50°, dass die 300° eigentlich -300° sind.
Bei der X-Achse sollte also die Wertigkeit entsprechend eingestellt werden. Dann müssten natürlich noch die Gradzahlen von 300 bis 0 eben in negative Zahlen umgekehrt werden.
Wäre das eine Möglichkeit?
AE | NI Germany
There are only two ways to tell somebody thanks: Kudos and Marked Solutions -
Wenn ich in Diadem 11.0 das Beispiel aus der Beispielgalerie "Beispiel zur Kanaltransformation", welches die "Bit-Extraktion" mittels Kurventransformation beschreibt, lade und in das Gerät "REPORT" wechsele, so wird das ganz normal aufgebaut und in der Listenansicht des Datenportals liegen die beiden Kanäle:
1 Zeit
2 Byte_Kanal
Wenn ich nun den Button "aktualisieren" drücke sieht die Listenansicht so aus:
1 Zeit
2 Byte_Kanal
ausgegraute Zeilen ohne Kanalnummern
Es gibt nach
1 x drücken des Buttons "aktualisieren" 16 ausgegraute Zeilen ohne Kanalnummern
2 x drücken des Buttons "aktualisiern" 32 ausgegraute Zeilen
usw.
Interessanter Weise erzeugt der Befehl "picupdate" aus einem Script oder dem Taschenrechner heraus aufgerufen diese Geisterzeilen nicht nur nicht, sondern löscht diese Zeilen auch, falls zuvor vorhanden.
Das selbe Beispiel führt mit Diadem 10.2 nie zu solchen Geisterzeilen.
Ich finde die Sache mit den Geisterkanälen unschön. Meine Befürchtung aber ist, daß mir derselbe Mechanismus in einer meiner Anwendungen "angemeldete Kanäle" zerschießt.
Daher wäre ich sehr an einer Behebung dieses Verhaltens interessiert.
Meine Fragen:
- kann jemand das Verhalten so reproduzieren?
- kann man dieses Verhalten vermeiden?
- wenn es sich - wie von mir befürchtet - um einen mit 11.0 eingeführten Programmfehler handelt, was ist die Erklärung und wann ist das abgestellt?
Vielen Dank,
Clemens
Attachments:
ghostchannels.jpg 498 KBHallo Clemens,
Meine Nachfrage an die Entwicklung traff den neuen CAR Eintrag, der nach Ihrer Nachfrage schon aufgeloest war (CAR #129531). Die Entwicklung sagt dass es hier um einen rein optischen Fehler geht-- es bleiben KEINE zusaetzliche Kanaele im Portal uebrig. Mit der Kurventransformation werden neue Kanaele temporaer erzeugt, aber danach sofort geloescht. Die Leer-Kanal-Erscheinung entspricht also etwa keinen neuen Speicherlast. Die Entwicklung sagt weiter, dass sie diesen optischen Fehler mit der naechsten DIAdem Version beheben werden, hoffentlich mit dem naechstem Service Pack.
Gruss,
Brad Turpin
DIAdem Product Support Engineer
National Instruments -
Hallo,
ich würde gerne Im Report in einer Kopfzeile das Datum einfügen, möchte das aber nicht manuel machen. Gibt es eine Möglichkeit in ein Textfeld eine Art Formel einzufügen und das Datum aus einer Kanal zu Laden?
Ausserdem wird mir auf der X-Achse bei der beschriftung zwar die Uhrzeit angezeit, und auch der Tag , aber leider nicht Monat und Jahr, kann man da etwas in den einstellungen ändern?
Danek schon mal
Gruß FlensHallo!
Sie können den Speicherdatum des Datensatzes im Datenportal im Report automatisch auslesen, falls Sie schreiben:
@RootPropGet("datestring")@
Sie können das aktuelles Datum auslesen mit @currdate@
Sonst, wenn Sie einem Datumskanal im Datenportal haben und das erste Wert des Kanals im Report auslesen wollen:
@str(chd(1,1), "#dd.mm.yyyy")@
Das "#dd.mm.yyyy" sagt, dass Sie einem Formatierung von Tag, Monat und Jahr haben wollen.
Das gleiches können Sie für das X-Achse machen. Machen Sie einem
Doppelclick auf dem X-Achse und geben als Format #dd.mm.yyyy hh:nn:ss
Schönes Wochenende
Ken Tobler -
Aus Script heraus Report bearbeiten
Hallo,
ich würde gerne aus einem laufenden Script heraus den Report bearbeiten z.B.
die Achsenskalierung in einem Diagramm verändern oder bei einem Graph (Kurve)
die Farbe verändern.
Es beseht ja die Möglichkeit im Interaktionsmodus " Ineractiv (on)/(off)
" Modus aus dem Script heraus manuell den Report zu bearbeiten, besteht
die Möglichkeit?
Und wenn ja, kann auch hier z.B. zum bearbeiten der Skalierung, oder ändern der
Graph-Farbe ein Dialog geöffnet werden... Grund der Interaktiv Modus kann ja
nur aus dem Script heraus gestartet werden?
MfG
SAMIOLHallo Samiol,
wie schon gesagt (siehe weiter oben), der "Schlüssel" zum Manipulieren von REPORT-Objekten ist die Tastenkombination CTRL-A. Wenn der Aufzeichnungsmodus aktiviert ist, werden Syntax und Varialbelzuweisungen in das Script übertragen. Ist der Aufzeichnungsmodus nicht aktiviert werden die Informationen in die Zwischenablage kopiert. Von dort aus können sie in das Script übertragen werden. Die zum gewünschten Ändern nicht notwendigen Zuweisungen können entfernt werden. Beispiel: Ich möchte die darzustellenden Kanäle eintragen und die Y-Skalierung bestimmen. Notwendig ist dazu nur folgendes:
'------------------- Curve and axis definition ---------------------
Call GraphObjOpen("2D-Axis1")
'------------------- Curve list -------------------------------
Call GraphObjOpen("2DObj5_Curve1")
D2CChnXName ="[1]/Zeit"
D2CChnYName ="[1]/Geschwindigkeit"
Call GraphObjClose("2DObj5_Curve1")
'------------------- Y scala ----------------------------------
Call GraphObjOpen("2DYAxis8_1")
D2AxisYScaleType ="manual"
D2AxisYBegin =30
D2AxisYEnd =50
Call GraphObjClose("2DYAxis8_1")
Call GraphObjClose("2D-Axis1")
Ablaufschema: Objekt öffnen, ggf. Unterobjekt öffnen, Variablen setzen und die Objekte in umgekehrter Reihenfolge wieder schließen.
Bitte schau dir hierzu auch die Hilfe und die Beispiele in der Hilfe an.
In deinem Fall müssen die Informationen aus dem SUD-Dialog - die ja in Variablen gespeichert sind - wie oben beschrieben den entsprechenden Variablen zugewiesen werden.
Wenn mit Exportiern das Layout gemeint ist und z.B. nur die letzte Seite als einzelne Layout-Seite gespeichert werden soll, so ist die Vorgehensweise wie folgt:
Komplettes Layout speichern, in der Layout-Verwaltung alle nicht gewünschten Layout-Seiten entfernen, übrig gebliebene Layout-Seite unter neuem Namen speichern, altes Layout wieder laden.
Wenn mit Exportieren das Erstellen eines JPG oder ähnliches gemeint ist, so wird immer nur die aktuelle Seite exportiert.
Gruß
Walter -
Hallo,
ich habe ein Problem mit dem REPORT in Diadem.
Ich möchte für eine Serienauswertung eine REPORT-Vorlage erzeugen. Wenn alle Kanalnamen immer an der geleichen Stelle stehen, funktioniert es auch. Lösche ich jedoch eine Kanalgruppe oder auch nur Kanäle vor dem betroffenen Kanal, so verschiebt sich der anzuzeigende Kanal im RPORT.
Ich habe unter Einstellungen-Optionen-Allgmeines für die "Namensorientierten Kanalbezüge" die Option "Gruppenname/Kanalname" gewählt. Dazu habe ich die unten zitierte Beschreibung gefunden. Nach der Beschreibung bin ich davon ausgegangen, dass sich die Anzeige ausschlißlich am Gruppennamen bzw. Kanalnamen orientiert. Meine Erfahrung ist jedoch, dass sich bei dieser Einstellung die Darstellung an der Kanalnummer orientiert - wie kann ich dies umgehen? Muß ich fr den Report noch eine andere Einstellung vornehmen? (Ich benutze z.Z. Diadem 10.2, das SP ist noch nicht installiert)
Grüße
Jonas Rosendahl
"Gruppenname/Kanalname - Verwenden Sie diese Einstellung, wenn die Kanalgruppen unterschiedliche Namen haben und die Kanäle unterschiedliche Namen haben und der Kanalbezug nur über beide Namen eindeutig ist. Der Kanalindex und der Gruppenindex können dabei unterschiedlich sein. Die Reihenfolge der Kanäle innerhalb einer Gruppe und die Reihenfolge der Gruppen zueinander kann sich dabei ändern. "Hallo,
in den Globalen Einstellungen legen Sie fest, wie genau der namesorientierte Bezug durchgeführt wird. Sie können zwischen Kombinationen aus Gruppen- und Kanal- -Name und -Nummer wählen. Alle einstellungen haben gemeinsam, dass die Kanalreferenz per String gespeichert wird - auch wenn im string wieder Nummern vorkommen.
Die Wahl zwischen numerischer und namensbezogener Referenz wird dann in den einzelnen Modulen gemacht (VIEW, REPORT, SCRIPT). Die Syntax der Namensauflösung wird dann aus den globalen Einstellungen übernommen.
Im Report wird diese Einstellung übrigens mit dem Layout gespeichert. Sie können also für jeden Report wählen, welche Referenz Sie benötigen.
MfG
Ingo Schumacher
Systems Engineer Sound&VibrationNational Instruments Germany -
Datenrate in bestimmten Bereichen ändern
Hallo,
ich möchte in bereits vorhandenen Datenaufzeichnungen die Datenrate für bestimmte Bereiche ändern um die Datengröße zu reduzieren aber die Kurve dabei nicht verkürzen.
Beispiel:
es werden Daten über eine Zeit von 60 Sekunden erfasst. Zwischen einzelnen Peaks sind längere Pausen wo die Spannung zwischen 0 und x Volt liegt. Diese Bereiche möchte ich gerne kürzen.
Hatte an ein VBS Script gedacht aber da stoße ich immer wieder auf Probleme, da die Länge des Kanals bis zu 49247232 Werte umfassen kann und mehr.smooth
create_groups
if Data.Root.ChannelGroups(1).Channels.Exists("PXI1Slot2\ai0") Then
find_peak_hv1
kurve_teilen_hv1
end if
if Data.Root.ChannelGroups(1).Channels.Exists("PXI1Slot2\ai2") Then
find_peak_hv2
kurve_teilen_hv2
end if
'Kurven glätten
sub smooth
if Data.Root.ChannelGroups(1).Channels.Exists("PXI1Slot2\ai0") Then
Call ChnSmooth("[1]/PXI1Slot2\ai0","[1]/u_hv1",2,"maxNumber") '... Y,E,SmoothWidth,SmoothType
End if
if Data.Root.ChannelGroups(1).Channels.Exists("PXI1Slot2\ai1") Then
Call ChnSmooth("[1]/PXI1Slot2\ai1","[1]/i_hv1",2,"maxNumber") '... Y,E,SmoothWidth,SmoothType
End if
if Data.Root.ChannelGroups(1).Channels.Exists("PXI1Slot2\ai2") Then
Call ChnSmooth("[1]/PXI1Slot2\ai2","[1]/u_hv2",2,"maxNumber") '... Y,E,SmoothWidth,SmoothType
End if
if Data.Root.ChannelGroups(1).Channels.Exists("PXI1Slot2\ai3") Then
Call ChnSmooth("[1]/PXI1Slot2\ai3","[1]/i_hv2",2,"maxNumber") '... Y,E,SmoothWidth,SmoothType
End if
end sub
'Untergruppen erstellen
sub create_groups
Call Data.Root.ChannelGroups.Add("U_HV1")
Call Data.Root.ChannelGroups.Add("I_HV1")
Call Data.Root.ChannelGroups.Add("U_HV2")
Call Data.Root.ChannelGroups.Add("I_HV2")
end sub
'Kurven Start- und Stop-Werte finden für HV1
sub find_peak_hv1
dim oChn, i, low_hv1, high_hv1
dim x
Dim peak, low, st
x = 1
st = 1
Call Data.Root.ChannelGroups(1).Channels.Add("high_hv1",DataTypeFloat64)
Call Data.Root.ChannelGroups(1).Channels.Add("low_hv1",DataTypeFloat64)
set oChn = Data.Root.ChannelGroups(1).Channels("u_hv1")
set high_hv1 = Data.Root.ChannelGroups(1).Channels("high_hv1")
set low_hv1 = Data.Root.ChannelGroups(1).Channels("low_hv1")
While low <> 0 or peak <> 0 or x <= 100
low = Find("Ch(""u_hv1"")>=3",st)
if low >= 0 then
peak = Find("Ch(""u_hv1"")<=3",low)
if low >=0 and peak >= low and peak-low >=10 then
low_hv1(x) = low
high_hv1(x) = peak
st = peak
x = x + 1
else st = peak
end if
end if
Wend
end sub
'Kurven Start- und Stop-Werte finden für HV2
sub find_peak_hv2
dim oChn, i, low_hv2, high_hv2
dim x
Dim peak, low, st
x = 1
st = 1
Call Data.Root.ChannelGroups(1).Channels.Add("high_hv2",DataTypeFloat64)
Call Data.Root.ChannelGroups(1).Channels.Add("low_hv2",DataTypeFloat64)
set oChn = Data.Root.ChannelGroups(1).Channels("u_hv2")
set high_hv2 = Data.Root.ChannelGroups(1).Channels("high_hv2")
set low_hv2 = Data.Root.ChannelGroups(1).Channels("low_hv2")
While low <> 0 or peak <> 0 or x <= 100
low = Find("Ch(""u_hv2"")>=3",st)
if low >= 0 then
peak = Find("Ch(""u_hv2"")<=3",low)
if low >=0 and peak >= low and peak-low >=10 then
low_hv2(x) = low
high_hv2(x) = peak
st = peak
x = x + 1
else st = peak
end if
end if
Wend
end sub
'Kurven teilen HV1
sub kurve_teilen_hv1
dim u_hv1_ch, i_hv1_ch
dim x
Dim low_hv1, high_hv1, st
x = 1
set high_hv1 = Data.Root.ChannelGroups(1).Channels("high_hv1")
set low_hv1 = Data.Root.ChannelGroups(1).Channels("low_hv1")
for x = 1 to Data.Root.ChannelGroups(1).Channels("high_hv1").Properties("length").Value
u_hv1_ch = "uhv1_" & x
i_hv1_ch = "ihv1_" & x
Call Data.Root.ChannelGroups("U_HV1").Channels.Add(u_hv1_ch,DataTypeFloat64) 'hier entstehen Numerische Channel, diese sollen aber den Zeitstempel übernehmen
Call Data.Root.ChannelGroups("I_HV1").Channels.Add(i_hv1_ch,DataTypeFloat64)
Call DataBlCopy(Data.Root.ChannelGroups(1).Channels("u_hv1"),low_hv1(x),high_hv1(x)-low_hv1(x),Data.Root.ChannelGroups("U_HV1").Channels(u_hv1_ch),1)
Call DataBlCopy(Data.Root.ChannelGroups(1).Channels("i_hv1"),low_hv1(x),high_hv1(x)-low_hv1(x),Data.Root.ChannelGroups("I_HV1").Channels(i_hv1_ch),1)
next
end sub
'Kurven teilen HV2
sub kurve_teilen_hv2
dim u_hv1_ch, i_hv1_ch
dim x
Dim low_hv2, high_hv2
x = 1
set high_hv2 = Data.Root.ChannelGroups(1).Channels("high_hv2")
set low_hv2 = Data.Root.ChannelGroups(1).Channels("low_hv2")
for x = 1 to Data.Root.ChannelGroups(1).Channels("high_hv2").Properties("length").Value
u_hv1_ch = "uhv2_" & x
i_hv1_ch = "ihv2_" & x
Call Data.Root.ChannelGroups("U_HV2").Channels.Add(u_hv1_ch,DataTypeFloat64)
Call Data.Root.ChannelGroups("I_HV2").Channels.Add(i_hv1_ch,DataTypeFloat64)
Call DataBlCopy(Data.Root.ChannelGroups(1).Channels("u_hv2"),low_hv1(x),high_hv1(x)-low_hv1(x),Data.Root.ChannelGroups("U_HV2").Channels(u_hv2_ch),1)
Call DataBlCopy(Data.Root.ChannelGroups(1).Channels("i_hv2"),low_hv1(x),high_hv1(x)-low_hv1(x),Data.Root.ChannelGroups("I_HV2").Channels(i_hv2_ch),1)
next
end sub
Hier das Script. Beim erstellen der Channel, in die die Kurven übertragen werden, entstehen Numerische Kanäle. Diese haben allerdings keinen Zeitstempel sondern verwenden als X-Skalierung die Zeilennummern. Wie erstellt man auch dort eine Zeit-Achse?
Können Sie mir anhand diesem Beispiel sagen wie ich nach dem kopieren Werte verwerfen kann und damit eine dynamische Datenrate erzeugen kann?
Vielen Dank
Sven Hermsmeier -
Store all values from updateable report on clientside for later use
apex 4.2 , 11xe
hello,
it is possible to store all values from an updateable report to something like an cache BEFORE sent it to DB ?
Background:
i have an modified updateable report ,look the jpg
http://www10.pic-upload.de/25.06.13/3zq5wr23awwg.jpg
updateable report have ever 29 rows. as example i make time entrys for an employee. very often the next employee have the same timeentrys. now iam thinking about to make the entrys for the first employee, then click a button to store the values from ALL cells into somting like a javascript cache or jquery.data() . when i pull another employee from lov i have a fresh empty report( with 29 rows) and now i want to call the data back from cache to the cells (with another button). the cache shouldnt be destroyed when refresh the page,cause there is a page refresh when pull another employee from lov.
is it possible to store all cell values(empty or not) from report all in one?
what is the best and simplest way ?
good would be an example for the code or method i should use.
or is somthing inside apex i could use for that. i looked in apex.api but didnt found something.
my report based on a view with iof trigger and apex collection.
greets/christianthx for answer jarola and sorry for my bad english.
apex collection will not work.
let me explain why not and i think something like javascript/jquery is better for that.
there is a table MAZEIT and i have this updateable report. when i select an employee from lov, a collection will be created. the collection look in MAZEIT ,perhaps there are real timeentrys, in this case the collection will be modified and give me 29 rows,some are filled. or there are no real entrys and the collection give me 29 empty rows.
here my report sql:
select
"HID_SEQ_ID",
"DATUM",
"WOTAG",
"WOTAGNR",
"KNDABT_ID",
"ZEIT",
"BEGINN",
"ENDE",
"PAUSE",
"ZUSCHLAG",
"BEM",
"MELDUNG"
from "#OWNER#"."V_COLL_MAZEIT"
here the v_coll_mazeit (view) sql
CREATE OR REPLACE VIEW V_COLL_MAZEIT AS
SELECT seq_id HID_SEQ_ID -- APEX_COLLECTIONS.SEQ_ID
,C001 HID_MAZEIT_ID -- MAZEIT.ID
,C002 DATUM -- Datum DD.MM.YYYY
,C003 WOTAG -- Wochentag Mo/Di/...
,C004 WOTAGNR -- Wochentag 1/2/...
,C005 KNDABT_ID -- Abteilung
,C006 ZEIT -- Zeit in HH24:MI
,C007 BEGINN -- Beginn in HH24:MI
,C008 ENDE -- Ende in HH24:MI
,C009 PAUSE -- Pause in HH24:MI
,C010 ZUSCHLAG
,C011 BEM
,C040 HID_MANDANT_ID
,C041 HID_KND_ID
,C042 HID_MA_ID
,C043 HID_KW
,C048 HID_HASH4CHECK -- Hash für Check auf Änderungen MAZEIT
,C049 HID_SORTIER -- für ORDER BY hier Arbeitsbeginn
,C050 MELDUNG -- für FehlerMeldungen
FROM APEX_COLLECTIONS
WHERE COLLECTION_NAME='V_COLL_MAZEIT'
ORDER BY HID_SORTIER;
here the trigger (iof) from v_coll_mazeit
CREATE OR REPLACE TRIGGER "V_COLL_MAZEIT_IOF_U_TRG"
INSTEAD OF UPDATE ON V_COLL_MAZEIT
FOR EACH ROW
BEGIN
--RAISE_APPLICATION_ERROR(-20004,'NIX DA');
CM_MEAT.V_COLL_MAZEIT_IOF_U_TRG(
:NEW.HID_SEQ_ID
,:NEW.HID_MAZEIT_ID
,:NEW.DATUM
,:NEW.WOTAG
,:NEW.WOTAGNR
,:NEW.KNDABT_ID
,:NEW.ZEIT
,:NEW.BEGINN
,:NEW.ENDE
,:NEW.PAUSE
,:NEW.ZUSCHLAG
,:NEW.BEM
,:NEW.HID_HASH4CHECK
,:NEW.HID_SORTIER
,:NEW.MELDUNG
END V_COLL_MAZEIT_IOF_U_TRG;
and here a package procedure when i select an employee:
PROCEDURE V_COLL_MAZEIT_PROC(
iAction IN PLS_INTEGER,
iDatum IN DATE DEFAULT SYSDATE,
iMandantId IN MAZEIT.MANDANT_ID%TYPE,
iKndId IN MAZEIT.KND_ID%TYPE,
iMaId IN MAZEIT.MA_ID%TYPE,
oCollName OUT VARCHAR2)
IS
TK_FUNC_NAME CONSTANT USER_OBJECTS.OBJECT_NAME%TYPE := 'V_COLL_MAZEIT_PROC';
TK_COLL_NAME CONSTANT APEX_COLLECTIONS.COLLECTION_NAME%TYPE := 'V_COLL_MAZEIT';
TK_MD5 CONSTANT VARCHAR2(2) := 'NO';
TYPE t_Tage_TAB IS TABLE OF DATE INDEX BY BINARY_INTEGER;
TYPE t_TageVC_TAB IS TABLE OF VARCHAR2(8) INDEX BY BINARY_INTEGER;
TYPE t_TageI_TAB IS TABLE OF PLS_INTEGER INDEX BY BINARY_INTEGER;
tTage t_Tage_TAB;
tTageVC t_TageVC_TAB;
tTageI t_TageI_TAB;
vDatum DATE;
vDatumCh VARCHAR2(8);
vKW4Db MAZEIT.KW%TYPE;
vI PLS_INTEGER := 0;
vAnz PLS_INTEGER := 0;
BEGIN
FOR rec IN (SELECT * FROM NLS_SESSION_PARAMETERS)
LOOP
InsProto(rec.PARAMETER||'=['||rec.VALUE||']',
QK_PACK_NAME,TK_FUNC_NAME);
END LOOP;
CMT.InsProto('iAction='||iAction||', iDatum='||iDatum||', iMandantId='||iMandantId||', iKndId='||iKndId||', iMaId'||iMaId,
QK_PACK_NAME,TK_FUNC_NAME);
oCollName := TK_COLL_NAME;
IF iAction=0 THEN -- löschen
IF APEX_COLLECTION.COLLECTION_EXISTS(p_collection_name=>TK_COLL_NAME) THEN
APEX_COLLECTION.TRUNCATE_COLLECTION(TK_COLL_NAME);
APEX_COLLECTION.DELETE_COLLECTION(TK_COLL_NAME);
END IF;
|| Säubern und anlegen
ELSIF iAction=1 THEN
IF APEX_COLLECTION.COLLECTION_EXISTS(p_collection_name=>TK_COLL_NAME) THEN
APEX_COLLECTION.TRUNCATE_COLLECTION(p_collection_name=>TK_COLL_NAME);
ELSE
APEX_COLLECTION.CREATE_COLLECTION(p_collection_name=>TK_COLL_NAME);
END IF;
vDatum := NVL(iDATUM,SYSDATE);
vDatum := TO_DATE(TO_CHAR(vDatum,'YYYYMMDD')||'000000','YYYYMMDDHH24MISS');
vKW4Db := GetKW4Db(vDatum);
tTage(1) := CMT.GetMonday(vDATUM,0);
SELECT tTage(1) + 1DAY,tTage(1) + 2DAY,tTage(1) + 3DAY,tTage(1) + 4DAY,tTage(1) + 5DAY,tTage(1) + 6DAY
INTO tTage(2),tTage(3),tTage(4),tTage(5),tTage(6),tTage(7)
FROM DUAL;
FOR i IN 1..7 LOOP tTageI(i) := 0; tTageVC(i) := TO_CHAR(tTage(i),'YYYYMMDD'); END LOOP;
-- erste Zeile enthält Default-Werte
APEX_COLLECTION.add_member( p_COLLECTION_name=> TK_COLL_NAME,p_generate_md5=>TK_MD5
,P_C001 => 0 -- MAZEIT.ID
,P_C002 => '<b>Vorgabe</b>' -- Datum DD.MM.YYYY
,P_C003 => ' ' -- Wochentag Mo/Di/...
,P_C004 => ' ' -- Wochentag 1/2/...
,P_C005 => 0 -- MAZEIT.KNDABT_ID
,P_C006 => NULL -- Zeit in HH24:MI
,P_C007 => NULL -- Beginn in HH24:MI
,P_C008 => NULL -- Ende in HH24:MI
,P_C009 => NULL -- Pause in HH24:MI
,P_C010 => NULL -- Zuschlag
,P_C011 => NULL -- Bem
,P_C040 => iMandantId
,P_C041 => iKndId
,P_C042 => iMaId
,P_C043 => vKW4Db
,P_C048 => '-1' -- Hash für Check auf Änderungen MAZEIT
,P_C049 => ' ' -- für ORDER BY hier Arbeitsbeginn
,P_C050 => NULL
FOR rec IN (SELECT z.*,
TO_CHAR(DBMS_UTILITY.get_hash_value(
z.id||'|'||
z.mandant_id||'|'||
z.majob_id||'|'||
z.ma_id||'|'||
z.knd_id||'|'||
z.kndabt_id||'|'||
z.kw||'|'||
z.arb_beg||'|'||
z.arb_end||'|'||
z.zeit||'|'||
z.pause||'|'||
z.zuschlag||'|'||
z.stk_anz||'|'||
z.stk_kg||'|'||
z.stk_gemuur||'|'||
z.stk_bezahlt||'|'||
z.bem||'|'||
z.ART4RECH
,1,POWER(2,30))) AS HID_HASH4CHECK
FROM MAZEIT z
WHERE z.MANDANT_ID=iMandantId AND
z.KND_ID=iKndId AND
z.MA_ID=iMaId AND
z.KW = GetKW4Db(tTage(1)) AND
z.ART4RECH IN (CMT.GetTCVNum('MAZEIT_ART4RECH_STD'),CMT.GetTCVNum('MAZEIT_ART4RECH_STK'),CMT.GetTCVNum('MAZEIT_ART4RECH_KG'))
ORDER BY z.ARB_BEG)
LOOP
IF rec.ZUSCHLAG=0 THEN
rec.ZUSCHLAG := NULL;
END IF;
vI := 0;
vDatumCh := TO_CHAR(rec.ARB_BEG,'YYYYMMDD');
FOR i IN 1..7 LOOP
IF tTageVC(i)=vDatumCh THEN
tTageI(i) := tTageI(i) + 1;
vI := i;
EXIT;
END IF;
END LOOP;
-- Stücklohn kommt an den Anfang der Bemerkung gekennzeichnet mit QK_COLL_MAZEIT_STK_KZ ursprüngliche Bemekuung nach dem :
rec.BEM := RTRIM(rec.BEM);
IF rec.ART4RECH = CMT.GetTCVNum('MAZEIT_ART4RECH_STK') THEN
DECLARE
vBem MAZEIT.BEM%TYPE := QK_COLL_MAZEIT_STK_KZ;
BEGIN
IF rec.STK_BEZAHLT > 0. THEN
vBem := QK_COLL_MAZEIT_STK_KZ||TO_CHAR(rec.stk_bezahlt,'FM9999D00');
ELSIF rec.STK_ANZ > 0 THEN
vBem := QK_COLL_MAZEIT_STA_KZ||TO_CHAR(rec.stk_anz,'FM9999');
END IF;
IF rec.BEM IS NULL THEN
rec.BEM := vBem;
ELSE
rec.BEM := SUBSTR(vBem||':'||rec.BEM,1,CMT.GetColLen('MAZEIT','BEM'));
END IF;
END;
ELSIF rec.ART4RECH = CMT.GetTCVNum('MAZEIT_ART4RECH_KG') THEN
DECLARE
vBem MAZEIT.BEM%TYPE := QK_COLL_MAZEIT_KG_KZ;
BEGIN
IF rec.STK_KG > 0. THEN
vBem := QK_COLL_MAZEIT_KG_KZ||TO_CHAR(rec.stk_kg,'FM999999D000');
END IF;
IF rec.BEM IS NULL THEN
rec.BEM := vBem;
ELSE
rec.BEM := SUBSTR(vBem||':'||rec.BEM,1,CMT.GetColLen('MAZEIT','BEM'));
END IF;
END;
END IF;
IF vI>0 THEN
IF tTageI(vI)=1 THEN
APEX_COLLECTION.add_member( p_COLLECTION_name=> TK_COLL_NAME,p_generate_md5=>TK_MD5
,P_C001 => rec.id -- MAZEIT.ID
,P_C002 => TO_CHAR(rec.ARB_BEG,'DD.MM.YYYY') -- Datum DD.MM.YYYY
,P_C003 => CMT.WoTag(rec.ARB_BEG) -- Wochentag Mo/Di/...
,P_C004 => CMT.WoTagNr(rec.ARB_BEG) -- Wochentag 1/2/...
,P_C005 => rec.KNDABT_ID -- MAZEIT.KNDABT_ID
,P_C006 => CMT.Minuten2InduZeit(rec.ZEIT) -- Zeit als InduZeit in HH24,MI
,P_C007 => TO_CHAR(rec.ARB_BEG,'HH24:MI') -- Beginn in HH24:MI
,P_C008 => TO_CHAR(rec.ARB_END,'HH24:MI') -- Ende in HH24:MI
,P_C009 => CMT.Minuten2HHMI(rec.PAUSE,TRUE) -- Pause in HH24:MI
,P_C010 => rec.ZUSCHLAG
,P_C011 => rec.BEM
,P_C040 => iMandantId
,P_C041 => iKndId
,P_C042 => iMaId
,P_C043 => vKW4Db
,P_C048 => rec.HID_HASH4CHECK -- Hash für Check auf Änderungen MAZEIT
,P_C049 => TO_CHAR(rec.ARB_BEG,'YYYYMMDDHH24MI') -- für ORDER BY hier Arbeitsbeginn
,P_C050 => NULL -- für FehlerMeldungen
ELSE
APEX_COLLECTION.add_member( p_COLLECTION_name=> TK_COLL_NAME,p_generate_md5=>TK_MD5
,P_C001 => rec.id -- MAZEIT.ID
,P_C002 => NULL -- Datum DD.MM.YYYY
,P_C003 => NULL -- Wochentag Mo/Di/...
,P_C004 => NULL -- Wochentag 1/2/...
,P_C005 => rec.KNDABT_ID -- MAZEIT.KNDABT_ID
,P_C006 => CMT.Minuten2InduZeit(rec.ZEIT) -- Zeit als InduZeit in HH24,MI
,P_C007 => TO_CHAR(rec.ARB_BEG,'HH24:MI') -- Beginn in HH24:MI
,P_C008 => TO_CHAR(rec.ARB_END,'HH24:MI') -- Ende in HH24:MI
,P_C009 => CMT.Minuten2HHMI(rec.PAUSE,TRUE) -- Pause in HH24:MI
,P_C010 => rec.ZUSCHLAG
,P_C011 => rec.BEM
,P_C040 => iMandantId
,P_C041 => iKndId
,P_C042 => iMaId
,P_C043 => vKW4Db
,P_C048 => rec.HID_HASH4CHECK -- Hash für Check auf Änderungen MAZEIT
,P_C049 => TO_CHAR(rec.ARB_BEG,'YYYYMMDDHH24MI') -- für ORDER BY hier Arbeitsbeginn
,P_C050 => NULL -- für FehlerMeldungen
END IF;
vAnz := vAnz + 1;
END IF;
END LOOP;
FOR i IN 1..7 LOOP
IF tTageI(i)<4 THEN
FOR j IN tTageI(i)+1..4 LOOP
IF j=1 THEN
APEX_COLLECTION.add_member( p_COLLECTION_name=> TK_COLL_NAME,p_generate_md5=>TK_MD5
,P_C001 => -1 -- MAZEIT.ID
,P_C002 => TO_CHAR(tTage(i),'DD.MM.YYYY') -- Datum DD.MM.YYYY
,P_C003 => CMT.WoTag(tTage(i)) -- Wochentag Mo/Di/...
,P_C004 => CMT.WoTagNr(tTage(i)) -- Wochentag 1/2/...
,P_C005 => 0 -- MAZEIT.KNDABT_ID
--,P_C006 => Minuten2InduZeit(0) -- Zeit als InduZeit in HH24,MI
,P_C006 => NULL -- Zeit als InduZeit in HH24,MI
--,P_C007 => '06:30' -- Beginn in HH24:MI
,P_C007 => NULL -- Beginn in HH24:MI
,P_C008 => NULL -- Ende in HH24:MI
--,P_C009 => Minuten2HHMI(0) -- Pause in HH24:MI
,P_C009 => NULL -- Pause in HH24:MI
,P_C010 => NULL -- Zuschlag
,P_C011 => NULL -- Bem
,P_C040 => iMandantId
,P_C041 => iKndId
,P_C042 => iMaId
,P_C043 => vKW4Db
,P_C048 => '-1' -- Hash für Check auf Änderungen MAZEIT
,P_C049 => TO_CHAR(tTage(i),'YYYYMMDD')||'99'||TO_CHAR(j,'FM09') -- für ORDER BY hier Arbeitsbeginn
,P_C050 => NULL
ELSE -- auffüllen
APEX_COLLECTION.add_member( p_COLLECTION_name=> TK_COLL_NAME,p_generate_md5=>TK_MD5
,P_C001 => -1 -- MAZEIT.ID
,P_C002 => NULL -- Datum DD.MM.YYYY
,P_C003 => NULL -- Wochentag Mo/Di/...
,P_C004 => NULL -- Wochentag 1/2/...
,P_C005 => 0 -- MAZEIT.KNDABT_ID
--,P_C006 => Minuten2HHMI(0) -- Zeit in HH24:MI
,P_C006 => NULL -- Zeit in HH24:MI
--,P_C007 => '06:30' -- Beginn in HH24:MI
,P_C007 => NULL -- Beginn in HH24:MI
,P_C008 => NULL -- Ende in HH24:MI
--,P_C009 => Minuten2InduZeit(0) -- Pause als InduZeit in HH24,MI
,P_C009 => NULL -- Pause als InduZeit in HH24,MI
,P_C010 => NULL -- Zuschlag
,P_C011 => NULL -- Bem
,P_C040 => iMandantId
,P_C041 => iKndId
,P_C042 => iMaId
,P_C043 => vKW4Db
,P_C048 => '-1' -- Hash für Check auf Änderungen MAZEIT
,P_C049 => TO_CHAR(tTage(i),'YYYYMMDD')||'99'||TO_CHAR(j,'FM09') -- für ORDER BY hier Arbeitsbeginn
,P_C050 => NULL
END IF;
END LOOP;
END IF;
END LOOP;
vI := 0;
FOR rec IN (SELECT * FROM V_COLL_MAZEIT) LOOP
vI := vI + 1;
CMT.InsProto('i='||LPAD(TO_CHAR(vI),3,' ')||':'||
rec.hid_seq_id||'|'||
rec.hid_mazeit_id||'|'||
rec.datum||'|'||
rec.wotag||'|'||
rec.wotagnr||'|'||
rec.zeit||'|'||
rec.beginn||'|'||
rec.ende||'|'||
rec.pause||'|'||
rec.zuschlag||'|'||
rec.bem||'|'||
rec.hid_hash4check||'|'||
rec.hid_sortier||'|'||
rec.meldung
,QK_PACK_NAME,TK_FUNC_NAME);
END LOOP;
ELSE
raise_Application_ERROR(-20100,'kann ich doch nicht Action='||TO_CHAR(iAction));
END IF;
END V_COLL_MAZEIT_PROC;
and here the procedure (look for real entrys in table)
PROCEDURE V_COLL_MAZEIT_IOF_U_TRG(
iHID_SEQ_ID apex_collections.seq_id%TYPE
,iHID_MAZEIT_ID apex_collections.C001%TYPE
,iDATUM apex_collections.C002%TYPE
,iWOTAG apex_collections.C003%TYPE
,iWOTAGNR apex_collections.C004%TYPE
,iKNDABT_ID apex_collections.C005%TYPE
,iZEIT apex_collections.C006%TYPE
,iBEGINN apex_collections.C007%TYPE
,iENDE apex_collections.C008%TYPE
,iPAUSE apex_collections.C009%TYPE
,iZUSCHLAG apex_collections.C010%TYPE
,iBEM apex_collections.C011%TYPE
,iHID_HASH4CHECK apex_collections.C048%TYPE
,iHID_SORTIER apex_collections.C049%TYPE
,iMELDUNG apex_collections.C050%TYPE
IS
PRAGMA AUTONOMOUS_TRANSACTION;
TK_FUNC_NAME CONSTANT USER_OBJECTS.OBJECT_NAME%TYPE := 'V_COLL_MAZEIT_IOF_U_TRG';
TK_COLL_NAME CONSTANT APEX_COLLECTIONS.COLLECTION_NAME%TYPE := 'V_COLL_MAZEIT';
vRcString VARCHAR2(2000) := NULL;
rCollMaZeit0 V_COLL_MAZEIT%ROWTYPE;
rCollMaZeit V_COLL_MAZEIT%ROWTYPE;
rMaZeit MAZEIT%ROWTYPE;
vHash4Check PLS_INTEGER;
vURow ROWID;
BEGIN
CMT.InsProto(
ihid_seq_id||'|'||
ihid_mazeit_id||'|'||
idatum||'|'||
iwotag||'|'||
iwotagnr||'|'||
iKNDABT_ID||'|'||
izeit||'|'||
ibeginn||'|'||
iende||'|'||
ipause||'|'||
izuschlag||'|'||
ibem||'|'||
ihid_hash4check||'|'||
ihid_sortier||'|'||
imeldung
,QK_PACK_NAME,TK_FUNC_NAME);
-- VIEW-ZeitZeile lesen
SELECT t.* INTO rCollMaZeit
FROM V_COLL_MAZEIT t
WHERE t.HID_SEQ_ID = iHID_SEQ_ID;
IF iHID_MAZEIT_ID!=rCollMaZeit.HID_MAZEIT_ID OR
iHID_HASH4CHECK!=rCollMaZeit.HID_HASH4CHECK THEN
vRcString := 'Daten seit Anzeige verändert';
GOTO MARK_TRANSEND;
END IF;
-- VIEW-ZeitDefaultZeile setzen
IF rCollMaZeit.HID_MAZEIT_ID=0 THEN
--,P_C005 => 0 -- MAZEIT.KNDABT_ID
--,P_C006 => NULL -- Zeit in HH24,MI
--,P_C007 => NULL -- Beginn in HH24:MI
--,P_C008 => NULL -- Ende in HH24:MI
--,P_C009 => NULL -- Pause in HH24,MI
--,P_C010 => NULL -- Zuschlag
--,P_C011 => NULL -- Bem
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>5, p_attr_value=>iKNDABT_ID);
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>6, p_attr_value=>iZEIT);
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>7, p_attr_value=>iBEGINN);
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>8, p_attr_value=>iENDE);
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>9, p_attr_value=>iPAUSE);
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>10, p_attr_value=>iZUSCHLAG);
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>11, p_attr_value=>iBEM);
IF iBEM LIKE '#%' THEN -- Verteilen
-- VIEW-ZeitDefaultZeile lesen
SELECT t.* INTO rCollMaZeit0
FROM V_COLL_MAZEIT t
WHERE t.HID_MAZEIT_ID = 0;
rCollMaZeit0.BEM := SUBSTR(iBEM,2);
DECLARE
vAnz PLS_INTEGER := 0;
nVert MAZEIT.ZEIT%TYPE;
nZeitMinuten MAZEIT.ZEIT%TYPE;
nDiffMinuten MAZEIT.ZEIT%TYPE;
BEGIN
SELECT NVL(COUNT(*),0) INTO vAnz
FROM V_COLL_MAZEIT t
WHERE t.HID_MAZEIT_ID = -1 AND
t.DATUM IS NOT NULL AND
t.WOTAGNR IN ('1','2','3','4','5'); -- nur Mo-Fr
IF vAnz<=0 THEN
vRcString := 'Verteilen nicht möglich keine freien Tage gefunden';
ELSIF TRIM(iZEIT) IS NULL OR TRIM(iZEIT) IN ('00,00','0,00','0',',00',',0','0,','0,0') THEN
vRcString := 'Verteilen von Null Minuten nicht möglich';
ELSE
nDiffMinuten := 0;
nZeitMinuten := CMT.InduZeit2MinutenNum(TRIM(iZEIT));
IF nZeitMinuten>(vAnz*1440) THEN
vRcString := 'Zu verteilende Zeit zu groß';
ELSIF vAnz>1 THEN
nVert := FLOOR(nZeitMinuten/vAnz);
nDiffMinuten := nZeitMinuten - (nVert*vAnz);
nZeitMinuten := nVert;
END IF;
IF vRcString IS NULL THEN
FOR rec IN (SELECT t.* INTO rCollMaZeit
FROM V_COLL_MAZEIT t
WHERE t.HID_MAZEIT_ID = -1 AND
t.DATUM IS NOT NULL AND
t.WOTAGNR IN ('1','2','3','4','5')) -- nur Mo-Fr)
LOOP
rCollMaZeit := rec;
vRcString := qV_COLL_MAZEIT_Insert(iKNDABT_ID, iZEIT, nZeitMinuten+nDiffMinuten, iBEGINN, iENDE, iPAUSE, iZUSCHLAG, SUBSTR(iBEM,2),
rCollMaZeit0, rCollMaZeit, rMaZeit);
IF vRcString IS NOT NULL THEN
EXIT;
END IF;
nDiffMinuten := 0;
END LOOP;
END IF;
END IF;
END;
END IF;
-- MAZEIT-Vorhandener Eintrag
ELSIF rCollMaZeit.HID_MAZEIT_ID>0 THEN
SELECT z.ROWID, TO_CHAR(DBMS_UTILITY.get_hash_value(
z.id||'|'||
z.mandant_id||'|'||
z.majob_id||'|'||
z.ma_id||'|'||
z.knd_id||'|'||
z.kndabt_id||'|'||
z.kw||'|'||
z.arb_beg||'|'||
z.arb_end||'|'||
z.zeit||'|'||
z.pause||'|'||
z.zuschlag||'|'||
z.stk_anz||'|'||
z.stk_kg||'|'||
z.stk_gemuur||'|'||
z.stk_bezahlt||'|'||
z.bem||'|'||
z.ART4RECH
,1,POWER(2,30))) AS HID_HASH4CHECK
INTO vURow, vHash4Check
FROM MAZEIT z
WHERE z.ID=rCollMaZeit.HID_MAZEIT_ID
FOR UPDATE NOWAIT;
IF vHash4Check!=rCollMaZeit.HID_HASH4CHECK THEN
vRcString := 'Daten seit Anzeige verändert';
GOTO MARK_TRANSEND;
END IF;
SELECT z.* INTO rMaZeit
FROM MAZEIT z
WHERE ROWID=vURow;
rMaZeit.KNDABT_ID := TO_NUMBER(TRIM(iKNDABT_ID));
IF TRIM(iBEGINN) IS NULL THEN
rMaZeit.ARB_BEG := NULL;
ELSE
rMaZeit.ARB_BEG := TO_DATE(TO_CHAR(rMaZeit.ARB_BEG,'YYYYMMDD')||TRIM(SUBSTR(iBEGINN,1,5)),'YYYYMMDDHH24:MI');
END IF;
IF TRIM(iENDE) IS NULL THEN
rMaZeit.ARB_END := NULL;
ELSE
rMaZeit.ARB_END := TO_DATE(TO_CHAR(rMaZeit.ARB_BEG,'YYYYMMDD')||TRIM(SUBSTR(iENDE,1,5)),'YYYYMMDDHH24:MI');
END IF;
IF TRIM(iZEIT) IS NULL THEN
rMaZeit.ZEIT := NULL;
ELSE
rMaZeit.ZEIT := CMT.InduZeit2MinutenNum(TRIM(iZEIT));
END IF;
IF TRIM(iPAUSE) IS NULL THEN
rMaZeit.PAUSE := NULL;
ELSE
rMaZeit.PAUSE := CMT.HHMI2Minuten(TRIM(iPAUSE));
END IF;
IF iWOTAGNR IN (6,7) AND
rMaZeit.PAUSE IS NOT NULL AND rMaZeit.PAUSE<>0 THEN
vRcString := 'Eintrag Pause am Wochenende nicht erlaubt';
GOTO MARK_TRANSEND;
END IF;
IF TRIM(iZUSCHLAG) IS NULL THEN
rMaZeit.ZUSCHLAG := NULL;
ELSE
rMaZeit.ZUSCHLAG := TO_NUMBER(TRIM(iZUSCHLAG));
END IF;
IF RTRIM(iBEM) IS NULL THEN
rMaZeit.BEM := NULL;
ELSE
rMaZeit.BEM := RTRIM(iBEM);
END IF;
IF (rMaZeit.KNDABT_ID IS NOT NULL AND rMaZeit.KNDABT_ID>0) OR
rMaZeit.ARB_BEG IS NOT NULL OR rMaZeit.ARB_END IS NOT NULL OR
(rMaZeit.ZEIT IS NOT NULL AND rMaZeit.ZEIT!=0) OR rMaZeit.PAUSE IS NOT NULL OR
rMaZeit.ZUSCHLAG IS NOT NULL OR rMaZeit.BEM IS NOT NULL THEN
DECLARE
vBem MAZEIT.BEM%TYPE := rMaZeit.BEM;
BEGIN
rMaZeit.ZUSCHLAG := NVL(rMaZeit.ZUSCHLAG,0.0);
qV_COLL_MAZEIT_BEM_CHK(rMaZeit); -- Bem prüfen wg. ART4RECH Verschlüsselung mittels QK_COLL_MAZEIT_STK_KZ
UPDATE MAZEIT z
SET z.KNDABT_ID = rMaZeit.KNDABT_ID
,z.ARB_BEG = rMaZeit.ARB_BEG
,z.ARB_END = rMaZeit.ARB_END
,z.ZEIT = rMaZeit.ZEIT
,z.PAUSE = rMaZeit.PAUSE
,z.ZUSCHLAG = rMaZeit.ZUSCHLAG
,z.BEM = rMaZeit.BEM
,z.STK_BEZAHLT = rMaZeit.STK_BEZAHLT
,z.STK_ANZ = rMaZeit.STK_ANZ
,z.STK_KG = rMaZeit.STK_KG
,z.ART4RECH = rMaZeit.ART4RECH
WHERE ROWID=vURow;
IF SQL%ROWCOUNT=1 THEN
NULL;
ELSIF SQL%ROWCOUNT<1 THEN
RAISE NO_DATA_FOUND;
ELSE
RAISE TOO_MANY_ROWS;
END IF;
rMaZeit.BEM := vBem;
END;
ELSE
DELETE FROM MAZEIT z
WHERE ROWID=vURow;
IF SQL%ROWCOUNT=1 THEN
NULL;
ELSIF SQL%ROWCOUNT<1 THEN
RAISE NO_DATA_FOUND;
ELSE
RAISE TOO_MANY_ROWS;
END IF;
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>1, p_attr_value=>-1);
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>48, p_attr_value=>'-1');
END IF;
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>5, p_attr_value=>rMaZeit.KNDABT_ID);
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>6, p_attr_value=>CMT.Minuten2InduZeit(rMaZeit.ZEIT));
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>7, p_attr_value=>TO_CHAR(rMaZeit.ARB_BEG,'HH24:MI'));
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>8, p_attr_value=>TO_CHAR(rMaZeit.ARB_END,'HH24:MI'));
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>9, p_attr_value=>CMT.Minuten2InduZeit(rMaZeit.PAUSE,TRUE) );
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>10, p_attr_value=>rMaZeit.ZUSCHLAG);
APEX_COLLECTION.update_member_attribute( p_COLLECTION_name=> TK_COLL_NAME, p_seq=>rCollMaZeit.HID_SEQ_ID
,p_attr_number=>11, p_attr_value=>RTRIM(rMaZeit.BEM));
-- MAZEIT neuer Eintrag
ELSIF rCollMaZeit.HID_MAZEIT_ID=-1 THEN
-- VIEW-ZeitDefaultZeile lesen
SELECT t.* INTO rCollMaZeit0
FROM V_COLL_MAZEIT t
WHERE t.HID_MAZEIT_ID = 0;
vRcString := qV_COLL_MAZEIT_Insert(iKNDABT_ID, iZEIT, NULL, iBEGINN, iENDE, iPAUSE, iZUSCHLAG, iBEM,
rCollMaZeit0, rCollMaZeit, rMaZeit);
ELSE
vRcString := 'Ungültige HID_MAZEIT_ID '||TO_CHAR(rCollMaZeit.HID_MAZEIT_ID);
END IF;
<<MARK_TRANSEND>>
IF vRcString IS NULL THEN
COMMIT;
ELSE
ROLLBACK;
RAISE_APPLICATION_ERROR(-20100,vRcString);
END IF;
END V_COLL_MAZEIT_IOF_U_TRG;
and in end there are 3 other procedures, all for table MAZEIT, the collection and and the report.
in princip its a good idea,to create another collection, but difficult to bind it to the report TOO,cause my "cell-fill- functionality" is to complicated.
my idea is another: to look with javascript/jquery whatever on clientside the cell-values. and only the editable cells. not the hidden cells.there would be ca. 180 editable cells. i want store the values from this cells all in one in a cache (clientside! ).
then select next employee (collection will be created with view ect.) and give me this 29 rows. in this moment i have cells with ID f02_0001 as example and can use the cache values with that. the ID's ever the same,cause i have ever 29 rows.
greets/christian -
In my project I have to make certain calculation and then get the data plotted in the given report template. I am using automated script for this. My script is doing all the calculations and then it not selecting and drag-dropping the selected channels on the report template. Its saving the blank report template.
I am struggling to get the data for specific channels plotted by using the script. I need the selected channels to be plotted on this report template and then get it saved.
Any help will be deeply appreciated. Thanks
Solved!
Go to Solution.Hi LaxG,
Brad is absolute right. It is possible to create your whole layout via script.
If you have loaded the example report layout you can copy these lines to create a new line in your plot. This is the recommended object oriented way.
call Report.Sheets("Blatt 1").Objects("2D-Axis1").Curves2D.Add(e2DShapeLine, "anyName")
Report.Sheets("Blatt 1").Objects("2D-Axis1").Curves2D.Item("anyName").Shape.XChannel.Reference = "[1]/Zeit"
Report.Sheets("Blatt 1").Objects("2D-Axis1").Curves2D.Item("anyName").Shape.YChannel.Reference = "[1]/Geschwindigkeit"
For performance reasons it's recommended to use the it like this.
dim oLine
set oLine = Report.Sheets("Blatt 1").Objects("2D-Axis1").Curves2D.Item("anyName").Shape
oLine.XChannel.Reference = "[1]/Zeit"
oLine.YChannel.Reference = "[1]/Geschwindigkeit"
Like Brad mentioned it is much easier, that you have a stored template of your report with all setings and customisations already done.
You open this layout file and have stored the names of your calculated channels. When you are doing this with a script they always have the same name and belong to the same group.
Now you can customize the references of the line items.
Kind Regards,
Philipp K.
AE | NI Germany -
Report is executing in background and need data(output) in excel format
Report is executing in background and need data(output) to get downloaded in excel format in my PC from an internal table;;in any drive i.e. C: or D: .When executing in backround it prompt to user with which location excel file to be saved and the name of file.How to download in background in excel format?
Edited by: PRASHANT BHATNAGAR on Aug 26, 2008 6:24 AMHi
Download a report to excel with format (border, color cell, etc)
Try this program...it may help you to change the font ..etc.
Code:
REPORT ZSIRI NO STANDARD PAGE HEADING.
this report demonstrates how to send some ABAP data to an
EXCEL sheet using OLE automation.
INCLUDE OLE2INCL.
handles for OLE objects
DATA: H_EXCEL TYPE OLE2_OBJECT, " Excel object
H_MAPL TYPE OLE2_OBJECT, " list of workbooks
H_MAP TYPE OLE2_OBJECT, " workbook
H_ZL TYPE OLE2_OBJECT, " cell
H_F TYPE OLE2_OBJECT. " font
TABLES: SPFLI.
DATA H TYPE I.
table of flights
DATA: IT_SPFLI LIKE SPFLI OCCURS 10 WITH HEADER LINE.
*& Event START-OF-SELECTION
START-OF-SELECTION.
read flights
SELECT * FROM SPFLI INTO TABLE IT_SPFLI UP TO 10 ROWS.
display header
ULINE (61).
WRITE: / SY-VLINE NO-GAP,
(3) 'Flg'(001) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP,
(4) 'Nr'(002) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP,
(20) 'Von'(003) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP,
(20) 'Nach'(004) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP,
(8) 'Zeit'(005) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP.
ULINE /(61).
display flights
LOOP AT IT_SPFLI.
WRITE: / SY-VLINE NO-GAP,
IT_SPFLI-CARRID COLOR COL_KEY NO-GAP, SY-VLINE NO-GAP,
IT_SPFLI-CONNID COLOR COL_NORMAL NO-GAP, SY-VLINE NO-GAP,
IT_SPFLI-CITYFROM COLOR COL_NORMAL NO-GAP, SY-VLINE NO-GAP,
IT_SPFLI-CITYTO COLOR COL_NORMAL NO-GAP, SY-VLINE NO-GAP,
IT_SPFLI-DEPTIME COLOR COL_NORMAL NO-GAP, SY-VLINE NO-GAP.
ENDLOOP.
ULINE /(61).
tell user what is going on
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 0
TEXT = TEXT-007
EXCEPTIONS
OTHERS = 1.
start Excel
CREATE OBJECT H_EXCEL 'EXCEL.APPLICATION'.
PERFORM ERR_HDL.
SET PROPERTY OF H_EXCEL 'Visible' = 1.
CALL METHOD OF H_EXCEL 'FILESAVEAS' EXPORTING #1 = 'c:\kis_excel.xls'
PERFORM ERR_HDL.
tell user what is going on
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 0
TEXT = TEXT-008
EXCEPTIONS
OTHERS = 1.
get list of workbooks, initially empty
CALL METHOD OF H_EXCEL 'Workbooks' = H_MAPL.
PERFORM ERR_HDL.
add a new workbook
CALL METHOD OF H_MAPL 'Add' = H_MAP.
PERFORM ERR_HDL.
tell user what is going on
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 0
TEXT = TEXT-009
EXCEPTIONS
OTHERS = 1.
output column headings to active Excel sheet
PERFORM FILL_CELL USING 1 1 1 'Flug'(001).
PERFORM FILL_CELL USING 1 2 0 'Nr'(002).
PERFORM FILL_CELL USING 1 3 1 'Von'(003).
PERFORM FILL_CELL USING 1 4 1 'Nach'(004).
PERFORM FILL_CELL USING 1 5 1 'Zeit'(005).
LOOP AT IT_SPFLI.
copy flights to active EXCEL sheet
H = SY-TABIX + 1.
PERFORM FILL_CELL USING H 1 0 IT_SPFLI-CARRID.
PERFORM FILL_CELL USING H 2 0 IT_SPFLI-CONNID.
PERFORM FILL_CELL USING H 3 0 IT_SPFLI-CITYFROM.
PERFORM FILL_CELL USING H 4 0 IT_SPFLI-CITYTO.
PERFORM FILL_CELL USING H 5 0 IT_SPFLI-DEPTIME.
ENDLOOP.
changes by Kishore - start
CALL METHOD OF H_EXCEL 'Workbooks' = H_MAPL.
CALL METHOD OF H_EXCEL 'Worksheets' = H_MAPL." EXPORTING #1 = 2.
PERFORM ERR_HDL.
add a new workbook
CALL METHOD OF H_MAPL 'Add' = H_MAP EXPORTING #1 = 2.
PERFORM ERR_HDL.
tell user what is going on
SET PROPERTY OF H_MAP 'NAME' = 'COPY'.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 0
TEXT = TEXT-009
EXCEPTIONS
OTHERS = 1.
output column headings to active Excel sheet
PERFORM FILL_CELL USING 1 1 1 'Flug'(001).
PERFORM FILL_CELL USING 1 2 0 'Nr'(002).
PERFORM FILL_CELL USING 1 3 1 'Von'(003).
PERFORM FILL_CELL USING 1 4 1 'Nach'(004).
PERFORM FILL_CELL USING 1 5 1 'Zeit'(005).
LOOP AT IT_SPFLI.
copy flights to active EXCEL sheet
H = SY-TABIX + 1.
PERFORM FILL_CELL USING H 1 0 IT_SPFLI-CARRID.
PERFORM FILL_CELL USING H 2 0 IT_SPFLI-CONNID.
PERFORM FILL_CELL USING H 3 0 IT_SPFLI-CITYFROM.
PERFORM FILL_CELL USING H 4 0 IT_SPFLI-CITYTO.
PERFORM FILL_CELL USING H 5 0 IT_SPFLI-DEPTIME.
ENDLOOP.
changes by Kishore - end
disconnect from Excel
CALL METHOD OF H_EXCEL 'FILESAVEAS' EXPORTING #1 = 'C:\SKV.XLS'.
FREE OBJECT H_EXCEL.
PERFORM ERR_HDL.
FORM FILL_CELL *
sets cell at coordinates i,j to value val boldtype bold *
FORM FILL_CELL USING I J BOLD VAL.
CALL METHOD OF H_EXCEL 'Cells' = H_ZL EXPORTING #1 = I #2 = J.
PERFORM ERR_HDL.
SET PROPERTY OF H_ZL 'Value' = VAL .
PERFORM ERR_HDL.
GET PROPERTY OF H_ZL 'Font' = H_F.
PERFORM ERR_HDL.
SET PROPERTY OF H_F 'Bold' = BOLD .
PERFORM ERR_HDL.
ENDFORM.
*& Form ERR_HDL
outputs OLE error if any *
--> p1 text
<-- p2 text
FORM ERR_HDL.
IF SY-SUBRC <> 0.
WRITE: / 'Fehler bei OLE-Automation:'(010), SY-SUBRC.
STOP.
ENDIF.
ENDFORM. " ERR_HDL
Regards
Murali Papana -
ALV ( How to save the output as Excel file whenever we runs the Report )
Hi,
Can any one please let me know , how we can automatically save a ALV Grid Display report in Excel Format in presentation server whenever we execute the Report.
Regards
Avi.Hi,
This report demonstrates how to send some ABAP data to an
EXCEL sheet using OLE automation.
INCLUDE OLE2INCL.
handles for OLE objects
DATA: H_EXCEL TYPE OLE2_OBJECT, " Excel object
H_MAPL TYPE OLE2_OBJECT, " list of workbooks
H_MAP TYPE OLE2_OBJECT, " workbook
H_ZL TYPE OLE2_OBJECT, " cell
H_F TYPE OLE2_OBJECT. " font
TABLES: SPFLI.
DATA H TYPE I.
table of flights
DATA: IT_SPFLI LIKE SPFLI OCCURS 10 WITH HEADER LINE.
*& Event START-OF-SELECTION
START-OF-SELECTION.
read flights
SELECT * FROM SPFLI INTO TABLE IT_SPFLI UP TO 10 ROWS.
display header
ULINE (61).
WRITE: / SY-VLINE NO-GAP,
(3) 'Flg'(001) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP,
(4) 'Nr'(002) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP,
(20) 'Von'(003) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP,
(20) 'Nach'(004) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP,
(8) 'Zeit'(005) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP.
ULINE /(61).
display flights
LOOP AT IT_SPFLI.
WRITE: / SY-VLINE NO-GAP,
IT_SPFLI-CARRID COLOR COL_KEY NO-GAP, SY-VLINE NO-GAP,
IT_SPFLI-CONNID COLOR COL_NORMAL NO-GAP, SY-VLINE NO-GAP,
IT_SPFLI-CITYFROM COLOR COL_NORMAL NO-GAP, SY-VLINE NO-GAP,
IT_SPFLI-CITYTO COLOR COL_NORMAL NO-GAP, SY-VLINE NO-GAP,
IT_SPFLI-DEPTIME COLOR COL_NORMAL NO-GAP, SY-VLINE NO-GAP.
ENDLOOP.
ULINE /(61).
tell user what is going on
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 0
TEXT = TEXT-007
EXCEPTIONS
OTHERS = 1.
start Excel
CREATE OBJECT H_EXCEL 'EXCEL.APPLICATION'.
PERFORM ERR_HDL.
SET PROPERTY OF H_EXCEL 'Visible' = 1.
CALL METHOD OF H_EXCEL 'FILESAVEAS' EXPORTING #1 = 'c:\kis_excel.xls'
PERFORM ERR_HDL.
tell user what is going on
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 0
TEXT = TEXT-008
EXCEPTIONS
OTHERS = 1.
get list of workbooks, initially empty
CALL METHOD OF H_EXCEL 'Workbooks' = H_MAPL.
PERFORM ERR_HDL.
add a new workbook
CALL METHOD OF H_MAPL 'Add' = H_MAP.
PERFORM ERR_HDL.
tell user what is going on
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 0
TEXT = TEXT-009
EXCEPTIONS
OTHERS = 1.
output column headings to active Excel sheet
PERFORM FILL_CELL USING 1 1 1 'Flug'(001).
PERFORM FILL_CELL USING 1 2 0 'Nr'(002).
PERFORM FILL_CELL USING 1 3 1 'Von'(003).
PERFORM FILL_CELL USING 1 4 1 'Nach'(004).
PERFORM FILL_CELL USING 1 5 1 'Zeit'(005).
LOOP AT IT_SPFLI.
copy flights to active EXCEL sheet
H = SY-TABIX + 1.
PERFORM FILL_CELL USING H 1 0 IT_SPFLI-CARRID.
PERFORM FILL_CELL USING H 2 0 IT_SPFLI-CONNID.
PERFORM FILL_CELL USING H 3 0 IT_SPFLI-CITYFROM.
PERFORM FILL_CELL USING H 4 0 IT_SPFLI-CITYTO.
PERFORM FILL_CELL USING H 5 0 IT_SPFLI-DEPTIME.
ENDLOOP.
changes by Kishore - start
CALL METHOD OF H_EXCEL 'Workbooks' = H_MAPL.
CALL METHOD OF H_EXCEL 'Worksheets' = H_MAPL." EXPORTING #1 = 2.
PERFORM ERR_HDL.
add a new workbook
CALL METHOD OF H_MAPL 'Add' = H_MAP EXPORTING #1 = 2.
PERFORM ERR_HDL.
tell user what is going on
SET PROPERTY OF H_MAP 'NAME' = 'COPY'.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 0
TEXT = TEXT-009
EXCEPTIONS
OTHERS = 1.
output column headings to active Excel sheet
PERFORM FILL_CELL USING 1 1 1 'Flug'(001).
PERFORM FILL_CELL USING 1 2 0 'Nr'(002).
PERFORM FILL_CELL USING 1 3 1 'Von'(003).
PERFORM FILL_CELL USING 1 4 1 'Nach'(004).
PERFORM FILL_CELL USING 1 5 1 'Zeit'(005).
LOOP AT IT_SPFLI.
copy flights to active EXCEL sheet
H = SY-TABIX + 1.
PERFORM FILL_CELL USING H 1 0 IT_SPFLI-CARRID.
PERFORM FILL_CELL USING H 2 0 IT_SPFLI-CONNID.
PERFORM FILL_CELL USING H 3 0 IT_SPFLI-CITYFROM.
PERFORM FILL_CELL USING H 4 0 IT_SPFLI-CITYTO.
PERFORM FILL_CELL USING H 5 0 IT_SPFLI-DEPTIME.
ENDLOOP.
changes by Kishore - end
disconnect from Excel
CALL METHOD OF H_EXCEL 'FILESAVEAS' EXPORTING #1 = 'C:\SKV.XLS'.
FREE OBJECT H_EXCEL.
PERFORM ERR_HDL.
FORM FILL_CELL *
sets cell at coordinates i,j to value val boldtype bold *
FORM FILL_CELL USING I J BOLD VAL.
CALL METHOD OF H_EXCEL 'Cells' = H_ZL EXPORTING #1 = I #2 = J.
PERFORM ERR_HDL.
SET PROPERTY OF H_ZL 'Value' = VAL .
PERFORM ERR_HDL.
GET PROPERTY OF H_ZL 'Font' = H_F.
PERFORM ERR_HDL.
SET PROPERTY OF H_F 'Bold' = BOLD .
PERFORM ERR_HDL.
ENDFORM.
*& Form ERR_HDL
outputs OLE error if any *
--> p1 text
<-- p2 text
FORM ERR_HDL.
IF SY-SUBRC <> 0.
WRITE: / 'Fehler bei OLE-Automation:'(010), SY-SUBRC.
STOP.
ENDIF.
ENDFORM. " ERR_HDL
Please note that this example maybe slow at filling the excel table
(perhaps four fields per second on a 900 MHz machine - almost 30 seconds
for a short example).
To get the data on properties and methods - there is a bit of smoke and mirrors
going on here; they are EXCEL properties and methods, not sap ones - so you need
to look at excel help to determine how a particular function is structured. then
build the block in sap, as shown in the example.
If you only want to transfer the data to Excel like when you transfer the data from
ALV to Excel simply use the Function Modules:
XXL_SIMPLE_API
If you want more modifications when you transfer it to Excel use:
XXL_FULL_API
Hope this helps.
Reward if helpful.
Regards,
Sipra
Maybe you are looking for
-
No superimposed results in Monitor - Premiere 6.0
Premiere 6.0 Video Track 2: Image for title superimpose Video Track 1: My video footage Trying to place an image in Video Track 2, adjust its Transparency setting, and see the superimposition in the program monitor. Even if I get the settings just ri
-
Calendar Server crashes in Yosemite 10.10 with Server App 4.0
I am running an OS X Server (4.0) in Yosemite 10.10 locally on my iMac to provide calendars in our house. Since the combined update of OS and the "Server App" the calendar server crashes frequently. It restarts when I run the server app but crashes a
-
SimpleDateFormat can parse 2009102x
Hello, If you look to the piece of code below, it seems my users can enter 2009102w. However, when one tries to enter 20091w20, it throws an error. I don't understand why an incorrect character in my date can get my date parsed?! Is this a bug or is
-
Why reports are fast when tables are available in local user
Dear All, I have one report refering ws1,ws2,t1,t2 which are in user "test". so in my qery of report i will write the query as select a.code,b.edu,c.dept_name,d.desg_desc from test.ws1 a,test.ws2 b,test.t1 c,test.t2 d where a.code = b.code and a.dept
-
Why some controls resizes in an Executable​?
i've created an 'exe' in which some front panel controls reduces size (differ from LV 8.5.1 development sysetm). especially all with floatingpoint datatypes. what could be the reason? can i avoid this problem? please reply with ur suggestions. thanks