Strange behaviour on Store procedure when calling from VB6 application
Hi,
I have a SP (thanks for the one who helped me out in this forum)
Declare @Temp Table (sensorname varchar(20),reading float,Date_Reading DatetIme,SAP float,SAN float) Insert @Temp select sensorname, reading, date_reading,(select alert_positive from sensor where sensor.sensorname = sensorreading.sensorname) as SAP, (select
alert_negative from sensor where sensor.sensorname = sensorreading.sensorname) as SAN from sensorreading where date_reading between '2014-12-03 23:59' and '2014-12-04 23:59'; SELECT sensorname, MAX(CASE WHEN BSeq = 1 THEN reading END) AS MaxReading, MAX(CASE
WHEN BSeq = 1 THEN Date_Reading END) AS MaxDateReading, MAX(CASE WHEN Seq = 1 THEN reading END) AS MinReading, MAX(CASE WHEN Seq = 1 THEN Date_Reading END) AS MinDateReading, MAX(CASE WHEN BSeq = 1 THEN SAP END) AS SAP, MAX(CASE WHEN BSeq = 1 THEN SAN END)
AS SAN From ( SELECT ROW_NUMBER() OVER (PARTITION BY sensorname ORDER BY reading) AS Seq, ROW_NUMBER() OVER (PARTITION BY sensorname ORDER BY reading DESC) AS BSeq,* FROM @Temp )t GROUP BY sensorname
I tried to run the SP from SQL server no matter to set parameters on DateFM / DateTO to any date, the data can returned from SQL.
However, when I call it in my VB6 program using ...
Set cmd = Nothing
Set rs = Nothing
Set cmd = New ADODB.Command
Set rs = New ADODB.recordset
cmd.ActiveConnection = mdbcnn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "dbo.SP_DailyReports"
dateTO = Now
dateFM = DateAdd("d", -1, dateTO)
'don't know why is only work on the below date range
cmd.Parameters.Append cmd.CreateParameter("@DateFM", adDBTimeStamp, adParamInput, 255, Format(DateFM,"yyyy-mm-dd hh:mm:ss"))
cmd.Parameters.Append cmd.CreateParameter("@DateTO", adDBTimeStamp, adParamInput, 255, Format(DateTO, "yyyy-mm-dd hh:mm:ss"))
Set rs = cmd.Execute
The recordset contains return values on the date @2014-10-10 to 2014-10-11, other dates will not returned any values.
I tried to remove the 255
cmd.Parameters.Append cmd.CreateParameter("@DateTO", adDBTimeStamp, adParamInput, , Format(CDate("2014-10-11 11:49"), "yyyy-mm-dd hh:mm:ss")) but still hasn't return data
Do you have any idea of this .. ?!
2014-10-10 to 2014-10-11 returned data sample from SQL
sensorname MaxReading MaxDateReading MinReading MinDateReading SAP SAN
DL-01-BAT 13.03485 2014-10-10 22:00:00.000 13.00753 2014-10-10 23:00:00.000 16.6000003814697 13
DL-02-BAT 12.063684 2014-10-10 20:00:00.000 12.057724 2014-10-10 23:00:00.000 13 10
DL-03-BAT 12.09362 2014-10-10 22:00:00.000 12.03034 2014-10-10 19:00:00.000 13 10
DL-04-BAT 12.49362 2014-10-10 22:00:00.000 12.43034 2014-10-10 19:00:00.000 13 10
DL-05-BAT 12.89362 2014-10-10 22:00:00.000 12.83034 2014-10-10 19:00:00.000 13 10
SVD-D045-P 414.2 2014-10-10 19:00:00.000 414.2 2014-10-10 19:00:00.000 450 350
SVD-D048-P 434.72 2014-10-10 19:00:00.000 434.72 2014-10-10 19:00:00.000 450 350
2014-12-03 to 2014-12-04 returned data sample from SQL
sensorname MaxReading MaxDateReading MinReading MinDateReading SAP SAN
DL-01-BAT 0.0027716304 2014-12-03 21:00:00.000 -0.0018678124 2014-12-04 08:00:00.000 16.6000003814697 13
DL-02-BAT 13.040122 2014-12-03 22:00:00.000 13.033486 2014-12-04 07:00:00.000 13 10
DL-03-BAT 13.067996 2014-12-03 21:00:00.000 13.061132 2014-12-04 09:00:00.000 13 10
DL-04-BAT 13.041772 2014-12-03 19:00:00.000 13.034222 2014-12-04 06:00:00.000 13 10
DL-05-BAT 13.042852 2014-12-03 17:00:00.000 13.036274 2014-12-04 09:00:00.000 13 10
SVD-D045-P -1.9226320056 2014-12-03 18:00:00.000 -2.80430085834 2014-12-04 09:00:00.000 450 350
SVD-D048-P 4.37950852736 2014-12-03 18:00:00.000 3.47056593536 2014-12-04 09:00:00.000 450 350
SVD-D049-P -2.09270840792 2014-12-03 17:00:00.000 -3.00283002844 2014-12-04 09:00:00.000 450 350
Hi,
The SP is
USE [CEDD2014]
GO
/****** Object: StoredProcedure [dbo].[SP_DailyReports] Script Date: 04/12/2014 2:42:57 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER procedure [dbo].[SP_DailyReports] @dateFM smalldatetime, @dateTO smalldatetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
Declare @Temp Table
sensorname varchar(20),
reading real,
Date_Reading DatetIme,
SAP real,
SAN real)
Insert @Temp
select sensorname, reading, date_reading,
(select alert_positive from sensor where sensor.sensorname = sensorreading.sensorname)
as SAP,
(select alert_negative from sensor where sensor.sensorname = sensorreading.sensorname)
as SAN
from sensorreading where date_reading between @DateFm and @DateTo;
SELECT sensorname,
MAX(CASE WHEN BSeq = 1 THEN reading END) AS MaxReading,
MAX(CASE WHEN BSeq = 1 THEN Date_Reading END) AS MaxDateReading,
MAX(CASE WHEN Seq = 1 THEN reading END) AS MinReading,
MAX(CASE WHEN Seq = 1 THEN Date_Reading END) AS MinDateReading,
MAX(CASE WHEN BSeq = 1 THEN SAP END) AS SAP,
MAX(CASE WHEN BSeq = 1 THEN SAN END) AS SAN
FROM
SELECT ROW_NUMBER() OVER (PARTITION BY sensorname ORDER BY reading) AS Seq,
ROW_NUMBER() OVER (PARTITION BY sensorname ORDER BY reading DESC) AS BSeq,*
FROM @Temp
)t
GROUP BY sensorname
END
Similar Messages
-
Environment.Exit hangs when called from an application domain exception handler
I've implemented a handler for exceptions not thrown in the main GUI thread of my C# WinForms application, as follows:
AppDomain.CurrentDomain.UnhandledException += OnUnhandledExceptionThrown;
This handler is called from a background thread. The last statement in this handler is a call to
Environment.Exit with the application exit code. However, the application hangs in this call. From within Visual Studio, it hangs and I'm unable to break the application; I have to use Task Manager to terminate Visual Studio. Environment.Exit
works fine when called from the unhandled exception handler for the GUI thread. Is there a better way to terminate the application in the context of an unhandled exception thrown by a background thread?Are you just trying to avoid a crash? Environment.Exit can cause deadlocking if exiting in the wrong kind of scenario; if you're just trying to avoid a crash, use
GetCurrentProcess with
TerminateProcess to terminate your own process. It skips the notification phases that Environment.Exit uses which prevents the common deadlock scenarios.
WinSDK Support Team Blog: http://blogs.msdn.com/b/winsdk/ -
Can I get the Write window in the foreground when called from another application?
When windows applications create a new message through thunderbird (quickbooks wants to send an invoice for example) the new message appears in the background and bothers the user who prefered the way outlook would pop up newly created messages in the foreground. The foreground popup is the preferred work flow as the operator clicks 'send invoice' and then the message pops up for review and for the operator to hit send. Now migrating to Thunderbird, in frustration the user is creating many drafts but not always sending the invoice.
How can I set Thunderbird to popup a new message window in the foreground in this case?
Thanks in advance.Hi, I have the same problem, any version of TB, win7x64 or winXP32... for me is not a problem, but less experienced users, or old people, get puzzled by not seeing the expected window, and usually keep trying, ending with multiple "compose" windows, until they realize they're open in the background...
I'm trying to get around this using a small free utility I already have in my windows startup folder: Deskpins (see http://www.snapfiles.com/get/deskpins.html). This little app, which sits in the taskbar icon area, can force any window stay on top, (visually) "pinning" it also. Very handy. This little gem also has an optional "autopin" feature, which can "intercept" a new window by class & title (with wildcards). Which windows to intercept,y ou define creating specific rules, from its help:
<<
You can configure DeskPins to automatically pin certain windows as soon as they are created. This should be useful in case you always want to make an application topmost (e.g. Calculator, console windows, etc).
Rules
You can specify which windows will be auto-pinned by adding auto-pin rules (see Autopin options). Every time a window is created, DeskPins will check whether it satisfies any rules, and if so, it will pin it. A rule consists of two parameters: a title and a class, which are explained below. Both parameters can contain DOS-style wildcards (* and ?) and they are not case sensitive.
>>
I tried, and it seems to work.
when a new "compose" window is created, even when "sending a file to recipient" using windows standard tools (eg: right click on file and send>mail recipient) now I see the window "on top" and is "pinned"... of course it would have been much, much better to have a native better behaviour, but in the meanwhile... this could work. Maybe similar solutions are available for other OSes...
Marco -
How do I return Labview errors from a LV executable when calling from another application?
I'm calling a third party executable under WindowsXP. The program returns an exit code when complete. I tried Sys Exec VI, but the 'return code' field does not seem to grab the exit code. Help.
Although I am not fully verse in this subject, I have to disagree because of previous experiences I had.
You can write executables that return "exit codes". For example, in C++ you can use the function exit(). The syntax of the function is:
#include
void exit(int status);
"status" is provided for the calling process as the exit status of the process. Typically a value of 0 is used to indicate a normal exit, and a nonzero value indicates some error.
In the past I've seen commercial applications that allows you add your own functions. Sometimes what the application expect is an exit code after your custom .exe executes.
Unfortunatelly, I've been unable to do this with LabVIEW, therefore I must use another development environment
such as MS VC++ or Borland C++ Builder to accomplish this. I wish I could do that with LabVIEW though...
Enrique
www.vartortech.com -
ORA-06502 when calling from a procedure
HI,
I have a procedure(p1) inside a package that queries a table and send out the result based on the input paramater value. OUT variable is of same type as the table column(using %type), column size is varchar2(4000). This procedure is called from another procedure(p2) and sends out the result to Java Page to display the results at front-end.
Problem is when application runs and p1 is called I get the following error message,
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
Length/size of the character string queried from table is _1747_ that is within the limit of 4000 chars. If I limit the output to just 500 using substr, I don't get any error but adding a single character startes throwing error. OUT variable in both p1 and p2 are declared as table.column%type and error comes from p1 only as confirmed by the error log.
When I call p1 or p2 from a declare block, I don't get any error.
This has really confused me and I am not able to find any reason for this difference in behaviour.
Request to help me in understanding what could be the issue here.
Oracle version used is Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit
-Thanks in Advance.CREATE or replace PROCEDURE p1
( l_id IN VARCHAR2
, l_str OUT VARCHAR2
) IS
l_temp VARCHAR2(4000);
BEGIN
SELECT Response_Message INTO l_temp FROM t1 WHERE Response_ID = l_id;
l_str := l_temp||'10 symbols';
END;
CREATE or replace PROCEDURE p2
( l_id IN VARCHAR2
, l_str OUT VARCHAR2
) IS
BEGIN
p1(l_id, l_str);
END;
/no errors in procedures, but
DECLARE
resultstr VARCHAR2(1000);
BEGIN
p2(58, resultstr);
DBMS_OUTPUT.PUT_LINE(resultstr);
END;
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "P1", line 8
ORA-06512: at "P2", line 6
ORA-06512: at line 4Procedure is called with small variable.
Try check all calls and all procedures for size and check if there are string concatenations. -
Stored Procedure Does Not Run Properly When Called From Portlet
We have a simple Java portlet that calls a PL/SQL stored procedure which we wrote. The stored procedure sends a large number of emails to users in our corporation using the "utl_smtp" package. The stored procedure returns a count of the emails back to the Java portlet when it's finished. This number is displayed in the portlet.
Our problem:
The stored procedure functions as expected when run from a PL/SQL block in SQL*Plus, and the Java portlet calls the procedure properly when sending out a smaller number of emails (Less than 200 usually). When we get into a higher number of emails the procedure hangs when called from the portlet, but it STILL functions properly from SQL*Plus. It does not return the number of emails sent
and the Java portlet is unable to return a SQLException. Also, we have noticed that emails are sent at a much slower pace from the stored procedure when it's called from the portlet.Any Ideas?
-
PicDelete and PicLoad asking to save changes when called from SUD
Hello!
I'm trying to load different reports, change text values and graphics and export those reports to images. Sometimes I want to remove all reportsheets and load a new layout, but when calling picdelete a messagebox pops up and asks the user whether he wants to save the changes. I'm trying to get rid of that messagebox because my script gets halted and I don't want the user to overwrite my layout.
This only happens when picdelete is called from a SUD and for the picdelete command this behaviour can be circumvented by using Call Execute("Call picdelete"). Sadly the same procedure does not work for the picload command.
When called from the DIAdem scripting tab the report is loaded fine but I have found no way to use this command from a SUD without the messagebox appearing.
Is there a workaround? Does DIAdem 2012 show the same behaviour?
Edit: I guess I was wrong about that Call Execute("Call picdelete") workaround. I'm seeing the same messagebox. I don't know why I thought that helped.
Best regards,
grmume
PS: I'm using DIAdem 2011Hi grmume
In DIAdem 2012 the behavior is the same. But we have a completely new easy to use object oriented programming interface. There exist a method that reset the modified status of the Report
http://zone.ni.com/reference/en-XX/help/370858K-01/reportapi/methods/report_method_resetmodified_ire...
In former versions you only have the readonly variable PicIsChanged.
But I tried a small script in DIAdem 2011 after changing the layout and it does not ask for saving the layout.
call PicDelete
Call picload("Demo.TDR")
Hope this helps
Winfried -
SESSION EXPIRED and CPU Utilisation is 100% when called from Pro*C
Dear Colleague
We are having a production system developed using Pro*c and PL/SOL packages in HP Unix.
The system is doing the following,
A file will be decoded using Proc and data will be load into 3 temporary tables (permanent table used for temporary) using SQLLoader. Then it calls a PL/SQL package which will process the data in the temporary tables and will store the summary information in Transaction table and will returns a unique id to the calling Pro*c module. The whole process is completed in a single process/oracle session.
The PL/SQL package, join the 3 Temporary tables and retrieve the data into an Oracle object(Collection) and process it. Then the processing summary will be loaded into Transaction table and return the Primary key.
Now the problem is, when the temporary tables are loaded with more than 200,000 rows, in some cases the system is running for hours before it finish. And during the process the session shows as EXPIRED in the database and CPU utilization for the respective ProcessId in Unix is almost 100%. Then after a while the session comes alive and finishes the process.
And for some other cases, with same row count, the entire process finished in seconds.
If the same process (PL/SQL package) when run directly using a separate session inside the database(and the temporary tables are still available), rather than calling from Pro*c, it finishes in seconds, where it took hours when called from Pro*c.
It will be highly appreciated, if anyone let me know, what actually is wrong. whether it is the resource allocation or should there any known problem in calling huge PL/SQL packages from Pro*C.
we are using Oracle 10g and HP-UX ed42 B.11.31 U System.
regards
SajidDear Colleague
I just want to rephrase the problem again.
We have a Pro*C application. This will read the binary file and dump the data in ascii format to a data file. Then, within from the pro*C, 14 Dynamic tables will be created using EXEC SQL EXECUTE IMMEDIATE statement, each having almost a maximum of 45 columns. Also, created INDEXES to the tables in the same way from Pro*C.
And Control file will be created as follows
OPTIONS (SILENT=(FEEDBACK)) UNRECOVERABLE
LOAD DATA
INTO TABLE FILENAME_BCI_USED
FIELDS TERMINATED BY '|'
TRAILING NULLCOLSColumns Listed
Then Sql loader will be called using system commands (from pro*C itself) to loead the data into the table, as follows.
sprintf(syscommand,"sqlldr %s CONTROL=%s DATA=%s log=%s rows=5000 direct=true", glb_connect_string,ctl_file,data_file, log_file );
ret_value = system(syscommand);data loaded successfully.
Then the Pro*C will call a PL/SQL package for processing the data.
The PL/SQL package, to process the data, dynamically construct the below query and use it for the reference cursor to retrieve data and load into a collection.
v_sql_query := 'SELECT '|| '/*+ index(b '||p_File_Name ||'_1) index(b '||p_File_Name ||'_2) index(s '||p_File_Name ||'_3) index(s '||p_File_Name ||'_4) index(s '||p_File_Name ||'_5) index(s '||p_File_Name ||'_6) index(e '||p_File_Name ||'_7)*/' || '
iot_call_record(b.rec_no ,
b.rec_type ,
substr(b.field1,1,15) ,
nvl(substr((select s0.field1 from ' || SU_Table ||
' s0 where s0.rec_no = s.rec_no and s0.sub_rec_type = 203) ,1, 25),
substr(b.field2, 1, 25)),
substr(b.field3,1,25) ,
b.field4 ,
b.field5 ,
s.field1 ,
s.field2 ,
(select sum(s1.field1) from ' || SU_Table ||
' s1 where s1.field2 = s.rec_no and trim(s1.field2) = ''00'' ) ,
s.field3 ,
e.field2/power(10,e.field3) ,
s.field4 ,
s.field5 ,
s.field6 ,
s.field7 ,
s.field8 ,
s.field9 ,
s.field10 ,
nvl(b.field6,''F'') ,
NULL ,
s.field11 ,
(select sum(s2.field11) from ' || SU_Table || ' s2 where s2.rec_no = s.rec_no) ,
NULL)
FROM ' || BCI_Table || ' b , ' || SU_Table || ' s, ' || EXCH_Table ||
' e WHERE b.filename = s.filename
AND b.rec_no = s.rec_no
AND (b.field7 = 0 OR b.field7 = 1)
AND TRIM(s.chg_type) = ''00''
AND (s.field1 = e.field2_Code )
AND not(s.field4 = ''V'' and s.field12 > 1)
AND not(s.field4 = ''W'' and s.field12 > 1)
AND not(b.rec_type = 75 and s.field12 > 1)
AND not(b.rec_type = 75 and s.field4 =''D'')
AND s.sub_rec_type <> 203
and (s.field12 = 1 or b.rec_type not in (20,30))';
OPEN cur_call_events FOR v_sql_query;
LOOP
g_tab_call_events.DELETE;
-- Execute immediate v_sql_query bulk collect into g_tab_call_events;
FETCH cur_call_events BULK COLLECT
INTO g_tab_call_events limit 5000;
EXIT WHEN g_tab_call_events.COUNT = 0;
BEGIN
SAVEPOINT Block_Begin;
process_records(p_file_name,
g_tab_call_events);
EXCEPTION
WHEN Severe_Error THEN
Write_error('S');
ROLLBACK TO Block_Begin;
WHEN Warning THEN
Write_error('W');
WHEN NO_DATA_FOUND THEN
Write_error('S');
ROLLBACK TO Block_Begin;
END;
END LOOP;And the above module is behaving strangely.
With almost 150K or more rows in BCI_Table & SU_Table each and less than 10 rows in EXCH_Table, the application takes more than 100 minutes to complete the process.
When we checked the session activity, it is showing the same query for a very long time.
Where as files with 100K or less rows are getting processed in a minute.
And the performance for 150K+ rows is inconsistent, that when we isolate the package and run it directly calling from oracle, it is getting executed in less than 4 minutes. Whereas it takes 100+ minutes from Pro*C.
The execution plan for the above query is given below
Object Owner Object Name Cost Cardinality Bytes CPU cost IO cost
SELECT STATEMENT, GOAL = HINT: FIRST_ROWS 494 2497 494406 143334576 483
TABLE ACCESS BY INDEX ROWID SCHEMA1 FILENAME_SU_USED 4 1 21 30610 4
INDEX RANGE SCAN SCHEMA1 FILENAME_3 3 1 21764 3
SORT AGGREGATE 1 13
INDEX RANGE SCAN SCHEMA1 FILENAME_5 3 1 13 22064 3
SORT AGGREGATE 1 7
TABLE ACCESS BY INDEX ROWID SCHEMA1 FILENAME_SU_USED 4 1 7 30706 4
INDEX RANGE SCAN SCHEMA1 FILENAME_3 3 1 21764 3
CONCATENATION
HASH JOIN 355 2496 1307904 103068617 347
TABLE ACCESS FULL SCHEMA1 FILENAME_EXCH_USED 3 2 26 35987 3
HASH JOIN 352 2496 813696 96532618 344
VIEW SYS VW_NSO_1 4 20 880 12549326 3
HASH UNIQUE 4 20 220 12549326 3
TABLE ACCESS FULL SCHEMA2 IOT_SERVICE_MATRIX 3 20 220 45207 3
HASH JOIN 347 15850 2234850 76145180 341
TABLE ACCESS FULL SCHEMA1 FILENAME_SU_USED 130 16584 1111128 33625872 127
TABLE ACCESS FULL SCHEMA1 FILENAME_BCI_USED 217 23757 1758018 31405896 214
NESTED LOOPS 139 1 198 40265959 136
NESTED LOOPS 135 1 154 27716633 133
NESTED LOOPS 132 1 141 27680646 130
TABLE ACCESS FULL SCHEMA1 FILENAME_SU_USED 129 1 67 27655992 127
TABLE ACCESS BY INDEX ROWID SCHEMA1 FILENAME_BCI_USED 3 1 74 24654 3
INDEX RANGE SCAN SCHEMA1 FILENAME_1 2 1 15493 2
TABLE ACCESS FULL SCHEMA1 FILENAME_EXCH_USED 3 1 13 35987 3
VIEW SYS VW_NSO_1 4 1 44 12549326 3
SORT UNIQUE 4 20 220 12549326 3
TABLE ACCESS FULL SCHEMA2 IOT_SERVICE_MATRIX 3 20 220 45207 3Regards
Sajid
Edited by: user12039545 on Jul 11, 2010 12:05 AM
Edited by: user12039545 on Jul 11, 2010 12:15 AM
Edited by: user12039545 on Jul 11, 2010 12:32 AM
Edited by: user12039545 on Jul 11, 2010 12:34 AM
Edited by: user12039545 on Jul 11, 2010 12:37 AM -
Java works stand alone does not when called from PL/SQL
I have this piece of code, which works as a standalone program: It takes in the en_var and returns a path.
But it wont work when called from a store procedure the line of code p = rt.exec("echo "+envar); returns a path as a standalone program returns null when called from a Oracle store procedure.
Thanks for any help just going around and round in circles.
import java.util.*;
class translate
public static String translatePath(String envar)
Runtime rt = Runtime.getRuntime();
int bufSize = 4096;
byte buffer[] = new byte[bufSize];
String path = null;
Process p = null;
String os = null;
String name = null;
String home = null;
String dir = null;
SecurityManager sm = null;
int len = 0;
try
System.out.println("Calling echo "+envar);
os = System.getProperty("os.name");
name = System.getProperty("user.name");
home = System.getProperty("user.home");
dir = System.getProperty("user.dir");
sm = System.getSecurityManager();
p = rt.exec("echo "+envar);
BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len);
path = new String(buffer);
//p.waitFor();
bis.close();
return path;
catch(Exception e)
System.out.println("Exception "+e);
return "ProcessProblem";
//path = "/rims/live/log";Still cant get it to work, it doesnt fall over anymore, but when I input $PATH, it will output $PATH instead of the path for $PATH i.e /rims/live: What does your program output please:
Here is my code:
import java.io.*;
import java.util.*;
class translate
public static String translatePath(String envar)
Runtime rt = Runtime.getRuntime();
Process p = null;
String echoOutput = null;
int len = 0;
try
System.out.println("Calling echo "+envar);
p = rt.exec(new String[]{"/bin/echo",envar});
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader br = new BufferedReader(isr);
echoOutput = br.readLine();
br.close();
isr.close();
return echoOutput;
catch(Exception e)
System.out.println("Exception "+e);
return "ProcessProblem";
//path = "/rims/live/log";
Thanks for all your help so far.
Tony -
'ORA-06502 character string buffer too small' when called from C# app
I have researched this problem and checked my variable sizes over and over again. I have tested the procedure within the Oracle Express environment and it works fine; HOWEVER, when the procedure is called from my C# app it produces the ORA-06502 error.
The stored procedure signature looks like this...
create or replace save_new_project (p_custorgid in number,
p_title in varchar2,
p_AOIName in varchar2,
p_description in varchar2,
p_receiveddate in date,
p_deadlinedate in date,
p_startdate in date,
p_createddate in date,
p_createdby in varchar2,
p_projectid out number,
p_statustypedescrip out varchar2)The OracleParameter in my C# app for the last out param is defined as such...
cmd.Parameters.Add(new OracleParameter("p_statustypedescrip", OracleDbType.Varchar2, 30, ParameterDirection.Output));As I said at the beginning of this post, the procedure works fine in the Oracle environment. So why is it not working by simply calling it from C#? I've tried changing the OracleDbType to CLOB which eliminates the error but it returns a bizarre result. It returns this string, "Oracle.DataAccess.Types.OracleClob". WTH?!!
Since CLOB doesn't really work either I switch back to Varchar2 and specify a size of 5000 (in the database the field I am querying is defined as Varchar(30)). I still get the ORA-06502 error.
I am clueless as to what the problem is. It should work and it does if I run a series of SQL statements in an Oracle SQL Command window. The test that works fine looks like this...
declare
v_projid projects.projectid%type;
v_statustypedescrip projectstatustypes.type%type; /* this is a varchar(30) */
begin
save_new_project(2, 'Some input text goes here', 'More input text', 'And more again','26-APR-2007','26-APR-2007','26-APR-2007','26-APR-2007','users name as inpujt text here',v_projid,v_statustypedescrip);
dbms_output.put_line('v_projid = ' || v_projid);
dbms_output.put_line('v_statustypedescrip = ' || v_statustypedescrip);
end;But calling save_new_project from C# throws ORA-06502. It identifies line 40 of my stored procedure. This is line 40...
p_statustypedescrip := v_statustypedescrip;Problem solved!!!
I don't know why this worked but it did. I changed how I declared the output parameter in my C# app. I used to have it on one line like this...
cmd.Parameters.Add(new OracleParameter("p_statustypedescrip", OracleDbType.Varchar2, 30, ParameterDirection.Output));but then I changed it to multiple lines like this...
OracleParameter prm11 = new OracleParameter();
prm11.ParameterName = "p_statustypedescrip";
prm11.OracleDbType = OracleDbType.Varchar2;
prm11.Size = 30;
prm11.Direction = ParameterDirection.Output;
cmd.Parameters.Add(prm11);I don't know why it works this way but it does and that's all I care about. -
Can a Stored Procedure be called from a Rule (not using Scripted JDBC Adap)
Hello smart people,
Question: Can a stored procedure be called from a Rule without using the Scripted JDBC Resource Adapter?
What's Desired: The project has very strong sql developers and average at best Java developers. We have been successful at implementing the scripted JDBC Resource Adapter which makes use of Java Bean shells. The custom Java Bean shell contains code that calls a stored procedure. We are cool with that process.
However we would like to be able to set up a Rule that calls a Stored Procedure without jumping thru the Java Bean Shell layer. The Stored Procedures we will be developing will not access the tables in the Waveset database. Instead the Stored Procedures will be accessing custom tables in a custom database. The custom DBase will be housed on the same dBase server as the Waveset database.
Environment: Identity Manager 7.1. Oracle 10i, and Unix OS.
It seems to me that this task is possible, but the posts in this forum make it sound like perhaps it is not.
Do any of you smart people agree that it should be possible or better yet has anyone implemented such an approach?
Thanks.We did this by putting all of the JDBC calls into a Java class, then instantiated that class and called the methods from within a rule. An example of a rule we used is this:
<Rule authType='UserMembersRule' name='List UserType'>
<block>
<defvar name='adapter'>
<new class='com.waveset.adapter.ScriptedJdbcResourceAdapter'/>
</defvar>
<invoke name='setResource'>
<ref>adapter</ref>
<invoke name='getObject' class='com.waveset.ui.FormUtil'>
<ref>context</ref>
<s>Resource</s>
<s>Banner</s>
</invoke>
</invoke>
<defvar name='jdbcHelper'>
<new class='edu.bates.JDBCHelper'>
<invoke name='getConnection'>
<ref>adapter</ref>
</invoke>
</new>
</defvar>
<defvar name='userList'>
<new class='java.util.ArrayList'/>
</defvar>
<invoke name='addQueryToList'>
<ref>jdbcHelper</ref>
<s>SQL QUERY HERE</s>
<ref>userList</ref>
</invoke>
<ref>userList</ref>
</block>
<MemberObjectGroups>
<ObjectRef type='ObjectGroup' id='#ID#Top' name='Top'/>
</MemberObjectGroups>
</Rule> -
HR_INFOTYPE_OPERATION not working when called from Dynamic action
Hi ,
Senario : I would like to execute a form from dynamic action which
creates a record in 0015 (Additional payment IT) .
I have writen the code as shown below am using FM HR_INFOTYPE_OPERATION
. When i execute the program from se38 it is creating a record, however it is
not created when it is called from dynamic action..when i debugged the code in
inside the FM HR_INFOTYPE_OPERATION there is a FM HR_MAINTAIN_MASTERDATA where
they are using call dialog (statement) and
sy-oncom = 'N' when called from Dynamic action and
sy-oncom = 'S' when called executed directly.
I tried to change the sy-oncom to S while run from Dynamic action it created
the record.
So Can anyone explain me abt sy-oncom and how can i resolve the issue..
code..
REPORT ZHRPYENH01 .
perFORM TERMIATION_9000.
INCLUDE DBPNPMAC.
FORM Termiation_9000 *
FORM TERMIATION_9000.
INFOTYPES : 0015.
*data : i .
*i ='c'.
*break-point.
*message i000(000) with i.
TABLES : PRELP.
DATA : P9000 TYPE PA9000." with header line.
DATA : P0000 TYPE STANDARD TABLE OF P0000 WITH HEADER LINE.
DATA : P0015 TYPE STANDARD TABLE OF P0015 WITH HEADER LINE.
DATA : HIRE_DATE LIKE SY-DATUM,
TERM_DATE LIKE SY-DATUM.
DATA : MOLGA LIKE T500L-MOLGA VALUE '25',
SEQNR LIKE PC261-SEQNR.
DATA : RGDIR TYPE STANDARD TABLE OF PC261 WITH HEADER LINE.
DATA : ACTUAL_PERIOD LIKE PA9000-RETENTION.
DATA : PNP-SW-FOUND TYPE SY-SUBRC ,
PNP-SY-TABIX TYPE SY-TABIX.
DATA : TER_PERNR LIKE PA0001-PERNR.
DATA : REF_PERNR LIKE PA0001-PERNR.
data : key type BAPIPAKEY.
data : payed_amount type p0015-BETRG.
data : future_payment_amount type p0015-BETRG.
data : p0002 like pa0002.
types : begin of t_deduction ,
deducation_date like p0015-begda,
future_payment_amount type p0015-BETRG.
types : end of t_deduction.
data : future_deduction type standard table of t_deduction with
*header line.
data : future_deduction type t_deduction .
data : RETURN type BAPIRETURN1.
*data : deduction_p0015 like standard table of p0015 with header line.
data : deduction_p0015 like p0015 .
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxx
****Prepare 0015 data for deduction
*deduction for payed amount
clear deduction_p0015.
*refresh deduction_p0015.
deduction_p0015-pernr = REF_PERNR.
*deduction_p0015-pernr = TER_PERNR.
deduction_p0015-lgart = 'M120'.
deduction_p0015-begda = sy-datum + 1 .
deduction_p0015-endda = sy-datum + 1 .
deduction_p0015-BETRG = payed_amount.
deduction_p0015-WAERS = 'SGD'.
deduction_p0015-ZUORD = TER_PERNR.
*append deduction_p0015.
**deduction for future payment amount
*loop at future_deduction.
*clear deduction_p0015.
*deduction_p0015-pernr = REF_PERNR.
**deduction_p0015-pernr = TER_PERNR.
*deduction_p0015-lgart = 'M120'.
*deduction_p0015-begda = FUTURE_DEDUCTION-DEDUCATION_DATE.
*deduction_p0015-endda = FUTURE_DEDUCTION-DEDUCATION_DATE.
*deduction_p0015-BETRG = future_deduction-future_payment_amount.
*deduction_p0015-WAERS = 'SGD'.
*deduction_p0015-ZUORD = TER_PERNR.
*append deduction_p0015.
*endloop.
Create a deduction wage type in 0015 for the employee
break-point.
CLEAR RETURN.
CALL FUNCTION 'BAPI_EMPLOYEET_ENQUEUE'
EXPORTING
NUMBER = REF_PERNR
VALIDITYBEGIN = '18000101'
IMPORTING
RETURN = return
if not return is initial.
message E000(000) with
'Referred Employee could not be locked for referal payment deducation,
please try after some time'.
endif.
CALL FUNCTION 'HR_INFOTYPE_OPERATION'
EXPORTING
INFTY = '0015'
NUMBER = REF_PERNR
SUBTYPE = 'M120'
OBJECTID =
LOCKINDICATOR =
VALIDITYEND = SY-DATUM
VALIDITYBEGIN = SY-DATUM
RECORDNUMBER =
RECORD = deduction_p0015
OPERATION = 'COPY'
TCLAS = 'A'
DIALOG_MODE = '2'
NOCOMMIT =
VIEW_IDENTIFIER =
SECONDARY_RECORD =
IMPORTING
RETURN = return
KEY = key
break-point.
COMMIT WORK.
if not return is initial.
*return-TYPE
*ID
*NUMBER
*MESSAGE
message I000(000) with return-MESSAGE.
endif.
CALL FUNCTION 'BAPI_EMPLOYEET_DEQUEUE'
EXPORTING
NUMBER = REF_PERNR
VALIDITYBEGIN = '18000101'
IMPORTING
RETURN = return
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxx
Thanks and regards
-Senthil Bala
Message was edited by: senthil balaHi Senthil
Why at all U want a subroutine to create a record in IT0015 through Dynamic action.There are some standard codes available to update infotypes.
Let me give U an example
14 9CON BETRG 4 2 I INS,0015 This will create a record in IT0015 when IT0014 is updated with Wagetype 9CON
14 9CON BETRG 4 3 W P0015-LGART='5400' Set wagetype for IT0015(Here U can use a subroutine call to set the wagetype)
14 9CON BETRG 4 4 W P0015-BETRG=P0014-BETRG set amount for IT0015(Here U can use a subroutine call to get the amount)
14 9CON BETRG 4 5 W P0015-BEGDA=P0014-ENDDA set the dates(Here U can use a subroutine call to set the dates)
Hope this will help U.
Please award points if helpful -
JTextField update problem when called from PropertyChangeEvent
Hi,
I'm trying to create forms that can be dynamically loaded with Class.forname(formName).
Those forms should always inherit some methods that make it easy to pass data to
them and receive data from them. The idea is that the data comes from a table which
sends a hashmap (String column/JTextField-name + String Value pairs) with firePropertyChanged
as soon as a new row is seleceted. The JTextFields in the form are marked with setName("FieldName") that has to correspond to the name of the columns of the table.
My problem is that I can't update the fields in my form when I'm calling getRow(HashMap)
from within propertyChangeEvent but that's necessary to keep the forms flexible.
JTextFieldName.setText(newText) just won't work. But it works when I call getRow(HashMap)
from the constructor. SwingWorker and threads to update the form didn't help.
I don't need to call pack() / update() / repaint() on the JFrame, do I ??
update() / validate() / repaint() etc. didn't work on the JTextField themselves.
Below is the code for one of the test-forms (just a JPanel that is inserted in a frame)
with all of it's methods. Does anybody have a solution to this problem ??
Thanks for taking time for that !!
Benjamin
* testTable.java
* Created on 15. April 2004, 16:12
package viewcontrol.GUI;
* @author gerbarmb
import javax.swing.*;
import java.awt.*;
import java.beans.*;
import java.util.*;
public class testTable extends javax.swing.JPanel
implements
java.awt.event.KeyListener,
java.beans.PropertyChangeListener {
* public static void main(String[] argv) { testTable tt = new testTable();
* JFrame jf = new JFrame(); jf.setContentPane(tt); jf.setVisible(true); }
/** Creates new customizer testTable */
public testTable() {
initComponents();
HashMap hm = new HashMap();
* Only for debugging, to see that the method getRow() works when
* called from the constructor.
hm.put("ttext", "TEst");
this.getRow(hm);
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the FormEditor.
private void initComponents() {//GEN-BEGIN:initComponents
java.awt.GridBagConstraints gridBagConstraints;
jLabel1 = new javax.swing.JLabel();
textIn = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
intIn = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
numIn = new javax.swing.JTextField();
jLabel4 = new javax.swing.JLabel();
dateIn = new javax.swing.JTextField();
jLabel5 = new javax.swing.JLabel();
dateTimeIn = new javax.swing.JTextField();
jLabel6 = new javax.swing.JLabel();
jCheckBox1 = new javax.swing.JCheckBox();
keepValues = new javax.swing.JCheckBox();
jButton1 = new javax.swing.JButton();
setLayout(new java.awt.GridBagLayout());
jLabel1.setText("Text");
add(jLabel1, new java.awt.GridBagConstraints());
textIn.setName("ttext");
textIn.setPreferredSize(new java.awt.Dimension(100, 21));
textIn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
textInActionPerformed(evt);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = 2;
add(textIn, gridBagConstraints);
jLabel2.setText("Integer");
add(jLabel2, new java.awt.GridBagConstraints());
intIn.setName("tint");
intIn.setPreferredSize(new java.awt.Dimension(50, 21));
add(intIn, new java.awt.GridBagConstraints());
jLabel3.setText("Number");
add(jLabel3, new java.awt.GridBagConstraints());
numIn.setName("tnum");
numIn.setPreferredSize(new java.awt.Dimension(50, 21));
add(numIn, new java.awt.GridBagConstraints());
jLabel4.setText("Date");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
add(jLabel4, gridBagConstraints);
dateIn.setName("tdate");
dateIn.setPreferredSize(new java.awt.Dimension(50, 21));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
add(dateIn, gridBagConstraints);
jLabel5.setText("DateTime");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
add(jLabel5, gridBagConstraints);
dateTimeIn.setName("tidate");
dateTimeIn.setPreferredSize(new java.awt.Dimension(80, 21));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridy = 1;
add(dateTimeIn, gridBagConstraints);
jLabel6.setText("Bit");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridy = 1;
add(jLabel6, gridBagConstraints);
jCheckBox1.setName("tbit");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridy = 1;
add(jCheckBox1, gridBagConstraints);
keepValues.setText("keep values");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 7;
gridBagConstraints.gridy = 3;
add(keepValues, gridBagConstraints);
jButton1.setText("Send");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 7;
gridBagConstraints.gridy = 2;
add(jButton1, gridBagConstraints);
}//GEN-END:initComponents
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
sendRow();
}//GEN-LAST:event_jButton1ActionPerformed
private boolean sendRow() {
java.util.HashMap hm = new java.util.HashMap();
Component[] cs = this.getComponents();
for (int i = 0; i < cs.length; i++) {
if (((Component) cs).getName() != null) {
if (cs[i] instanceof JCheckBox) {
String value = ((JCheckBox) cs[i]).isSelected() ? "1" : "0";
hm.put(cs[i].getName(), value);
} else if (cs[i] instanceof JCheckBox) {
hm.put(cs[i].getName(), ((JTextField) cs[i]).getText());
} // end for
firePropertyChange("rowChanged", null, hm);
return true;
private void getRow(java.util.HashMap hm) {
//if (! this.keepValues.isSelected()) {
Component[] cs = this.getComponents();
for (int i = 0; i < cs.length; i++) {
if (cs[i].getName() != null && hm.containsKey(cs[i].getName())) {
Component component = cs[i];
String componentName = cs[i].getName();
String componentValue = (String) hm.get(component.getName());
if (cs[i] instanceof JTextField) {
// output for debugging
System.out.println("Setting " + cs[i].getName() + " = "
+ componentValue);
((JTextField) component).setText(componentValue);
} else if (cs[i] instanceof JCheckBox) {
// output for debugging
System.out.println("JCheckBox found");
JCheckBox cb = (JCheckBox) component;
boolean selected = (componentValue == null ? false : (componentValue.equals("1")
? true
: false));
((JCheckBox) component).setSelected(selected);
} // end for
/* Uncomment this code snippet to retrieve the text that has been set
for the components (that means JTextFields)
This is just for debugging !
Component[] cs = this.getComponents(); for (int i = 0; i < cs.length;
i++) { if (cs[i].getName() != null) { if (cs[i] instanceof
JTextField) { System.out.println("Value of " +cs[i].getName() + " = " +
((JTextField) cs[i]).getText()); } } } // end for
private void textInActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_textInActionPerformed
}//GEN-LAST:event_textInActionPerformed
public void keyPressed(java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
sendRow();
public void keyReleased(java.awt.event.KeyEvent e) {
public void keyTyped(java.awt.event.KeyEvent e) {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("newRow")) {
final PropertyChangeEvent finalEvt = evt;
Runnable makeChanges = new Runnable () {
public void run() {
getRow((java.util.HashMap) finalEvt.getNewValue());
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JTextField dateIn;
private javax.swing.JTextField dateTimeIn;
private javax.swing.JTextField intIn;
private javax.swing.JButton jButton1;
private javax.swing.JCheckBox jCheckBox1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JCheckBox keepValues;
private javax.swing.JTextField numIn;
private javax.swing.JTextField textIn;
// End of variables declaration//GEN-END:variablesThe problem of the change in the form not being comitted is that
I forgot SwingUtilities.invokeLater(makeChanges); in the bottom
part in public void propertyChange(java.beans.PropertyChangeEvent evt)
after having created a new Runnable.
Changes to the UI often have to be comitted by SwingUtitlities.invokeLater()
though I don't know that much about Swing yet.
Thanks to everybody who tried to solve that problem.
Benjamin -
Advanced table:not able to view more than 10 rows when called from workflow
Hi everyone,
I'm calling a page that contains advanced table and its controller class from two places.
First one is from a inquiry form, when this page is called it works fine. when there are more than 10 rows, first 10 are shown on page render and when we click on Next link, other rows are shown. This is becuase I have given the records displayed property on adavanced table = 10. I'm fine till here.
Second one is I'm calling this page again from a workflow notificaiton. There is a link called view more details on the workflow notification , click of this link will open the page with 10 records displayed. But when user tries to click on Next it doesn't work. It just doesn't refresh.
Its very wierd,. not able to understand what could be wrong when calling from wf notificiton. Its the same page and conroller code used in both the places.
Please help me!!
Thanks
SunnyThanks for your response Kristofer. You are correct, there was a difference in the parameters and the issue is resolved now.
-
Set the default field value to transaction code field, when calling from WD
Hi all,
Can we pass the value in a input field of a standard transaction calling from WD application. Suppose we are calling a transaction VA03 in an external window, then how will be pass the value in the VBAK_VBELN screen field.
Is there any way to pass the value to this transaction field. I have also tried out to set the parameter ID 'AUN' for VA03 transaction VBELN field. But it did not work for me.
Is there any way to set the default field value to transaction code field, when calling from WD?
Please suggest, if anyone have any idea.
Thanks
SanketHi,
I am using the below code to open a standard transaction. It will help you to explain my point more easily.
DATA: url TYPE string,
host TYPE string,
port TYPE string.
*Call below method to get host and port
cl_http_server=>if_http_server~get_location(
IMPORTING host = host
port = port ).
*create URL
CONCATENATE 'http'
'://' host ':' port
'/sap/bc/gui/sap/its/webgui/?sap-client=&~transaction=' 'VA03'
INTO url.
*get the window manager as we are opening t code in external window.
DATA lo_window_manager TYPE REF TO if_wd_window_manager.
DATA lo_api_component TYPE REF TO if_wd_component.
DATA lo_window TYPE REF TO if_wd_window.
lo_api_component = wd_comp_controller->wd_get_api( ).
lo_window_manager = lo_api_component->get_window_manager( ).
call the url which we created above
lo_window_manager->create_external_window(
EXPORTING
url = url
RECEIVING
window = lo_window ).
lo_window->open( ).
Note*
One more query I want to add to this thread, that is there any possibility to call a custom transaction as well?
Maybe you are looking for
-
Does CC alert generation take into account 1/ act or 2/ act+perm ?
Dear Forum, Can somebody shed some light on how alert generation works ? Are only the entries in the action tab of a function relevant ? 1. Suppose you have alertlog.txt $ cat Alertlog.log SYS-001 JDOE SM30 2008-07-28 09:15:07
-
The nice man Joseph Shen helped me with my google problem on my iPhone and worked for 2 days and now not working again please help me solve this problem were I can retrieve my messages on the I phone when I am not at home on my wi Fi is the only tim
-
We currently are testing XML Publisher 5.6.2 and are very new to the this product. I have it running in OC4J test instance on 10g 10.1.2.0.x. My question is reqarding pagination support for reports via xml publisher in HTML format. Can someone give m
-
Add multiple entries to dropdown list without using data dictionary
Hi, By default when we use a data dictionary element for dropdown list, all the possible values are listed in the dropdown. However when no data dictionary element is used for the dropdown list, it behaves like a parameter with a single line. I would
-
Hi, I hace an scenario with a main workflows and several subworkflows (one for each line item of a sales order)...The problem is when one of those subworkflows ends with error (when one of its methods raises an exception), the main WF ends with error