BatchUpdate int returned -2
int [] numUpdates=prepStmt.executeBatch();
HereCould anyone tell me why does the "numUpdates[intI]" return -2.
Yes i understand that it indicates that the number of updated rows cannot be determined, however i would like to know exactly why and when does this happen.
Also i would like to know that if any of the preparedStatement.addBatch() for Update queries, if the where clause (which is part of the Update Query) is not satisfied then what does this preparedStatement.executeBatch() return ?
You can also Email on,
[email protected]
Thank you all in advance !
however i would like to know exactly why and when does this happen.It depends on the driver. Look in the documentation for your driver, or contact the people who support it.
if the where clause (which is part of the Update Query) is not satisfied then what does this preparedStatement.executeBatch() return ?If the number of rows to be updated is zero, you mean? My uneducated guess would be that it returns zero. You could try it yourself and see what it really returns.
Similar Messages
-
Why findByAltKey(String keyName, Key key, int) returns a RowIterator object
Hi All,
I was thinking that why findByAltKey(String keyName, Key key, int) returns a RowIterator object and not Row object because alternate key is a candidate key and is unique so only one record should be there for a particular alternate key.
Thanks
PuneetfindByKey (which you could also use) returns Row[]. findByAltKey is just a special version of findByKey that returns a RowIterator.
Probably it's not going to change for historical reasons.
Plus, the Key you use doesn't have to be a full key - it can be a partial one, meaning that you can match more than one row.
John -
Making an int() return more than one method?
hey people. i need an int, for example,
public int someInt(){
return 1000;
}to return more than one number. To clarify, i need to be able to call the int() and it return me three different values. Is this possible?BigDaddyLoveHandles wrote:
Word origins: guru
Hmmm... "Heavy, weighty"
Reminds me of a t-shirt my brother has. He's a rather portly gentlemen. The shirt has a picture of Buddha and the caption, "I have the body of a god." -
Only ints return from SQLite queries with calculations
Howdy. Hope I have the right forum for this question.
I'm on a project using a SQLite database in Flex 4 and I'm using the following SQL query:
SELECT max(totalScore) AS score,
max(longestStreak) AS streakLen,
max((correctNotes * 100) / totalNotes) AS accuracyPercent
FROM main.practiceRecord rec
JOIN main.lessonSession sess
ON rec.sessionGuid = sess.guid
WHERE sess.purchasedLessonID = :lessonId
The query is working fine as it is written. The problem is that when I do the calculation ((correctNotes * 100) / totalNotes) to return a percent value, I'd like to do it without having to multiply by 100, since I generally treat percentages as numbers between 0 and 1 (.68 = 68%). If I don't multiple by 100 in the query, however, I get a "0" for anything less than 1, so only 100% returns with the correct value. It appears that this kind of calculation only returns an int, as opposed to a REAL (or its AS3 corresponding "Number").
Is there something that I can do to return a value between 0 and 1 for this percentage so that I don't have to multiply by 100 in the query and then divide by 100 when I get the result? Is there a function that allows me to specify the precision for the returned value?
Thanks for your time,
BryanMaybe Tom Kyte's "trick" of the "select pl_sql_function () from dual" to invoke scalar subquery caching can help you:
select ename
from emp, dept
where (select dname_lookup(emp.deptno) from dual) = 'SALES'
and dept.deptno = 30
and emp.deptno = dept.deptno;http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1547006324238
As Tom says, in 11g you'll be able to cache that function (new 11g feature) which removes the need for the "trick":
Oracle® Database PL/SQL Language Reference 11g Release 1 (11.1)
- 8 Using PL/SQL Subprograms
-- Using the Cross-Session PL/SQL Function Result Cache
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/subprograms.htm#BABFHACJ
"On the PL/SQL Function Result Cache" by Steven Feuerstein
http://www.oracle.com/technology/oramag/oracle/07-sep/o57plsql.html
Regards,
Zlatko -
Returning int array from C to Java as method parameter
Hello,
I've been trying to accomplish this
Java
int[] myArray = ... (filled with some data);
int retCode = myNativeCall(myArray);
if(retCode == 0)
doSomethingWith(myArray); //myArray gets overwritten with new data (with new size also) during the native call...
C
JNIEXPORT jint JNICALL Java_GenChav_rsaEncrypt(JNIEnv *env, jobject obj, jintArray myArray){
jintArray outbuf;
int[] new_array = .. // some function will fill this....
int new_array_length = ...//some function will give me the new size, not big, 512 max...
jint tmp[new_array_length]; //allocate..need something more ??
memcpy(tmp, new_array, new_array_lenght);
outbuf=(*env)->NewIntArray(env, new_array_length);
(*env)->SetIntArrayRegion(env, outbuf, 0, new_array_length, tmp);
myArray=outbuf;
I tought this way I would have a updated myArray ints on the Java program...
Any thought??user5945780 wrote:
Ok, let's try to be constructive here...
How I do implement a return type for my method like a int array ?First realized it has nothing to do with JNI. So the same question and answer applies to java only.
>
like:
int[] return = myNativeCall();
Yes.
Then I will look for return[0], if it is == to 0, fine, it means a successful calculation by the native code. Not sure what that means. The structure of what you return it up to you.
It can help when you are unsure of what to do in JNI....write a pseudo representation of what you want to do in a java method. Then translate that java method into JNI, everything in the pseudo method must be in the JNI code. -
Error while creating function with record type as return type
Hi i tried the following code to get the nth highest sal using record type and function.
CREATE OR REPLACE PACKAGE pack_rec_cur AS
TYPE rec_type IS RECORD (
name EMP.ename%TYPE,
sal EMP.sal%TYPE);
END;The above package is created
CREATE OR REPLACE
FUNCTION fun_rec_cur(n INT) RETURN pack_rec_cur.rec_type AS
rec pack_rec_cur.rec_type;
CURSOR cur_rec IS
SELECT ename,sal
FROM emp
WHERE sal is not null
ORDER BY DESC;
BEGIN
OPEN cur_rec;
FOR i IN 1..n LOOP
FETCH cur_rec into rec;
EXIT WHEN cur_rec%NOTFOUND;
END LOOP;
CLOSE cur_rec;
RETURN rec;
END; The above function is giving errors
LINE/COL ERROR
4/7 PL/SQL: SQL Statement ignored
7/16 PL/SQL: ORA-00936: missing expression
SQL> Could you please correct me where i'm doing mistake
Thanks.You are missing the column name in order by clauase. Is it ename desc?
CREATE OR REPLACE
FUNCTION fun_rec_cur(n INT) RETURN pack_rec_cur.rec_type AS
rec pack_rec_cur.rec_type;
CURSOR cur_rec IS
SELECT ename,sal
FROM emp
WHERE sal is not null
ORDER BY ENAME DESC; ---added ename
BEGIN
OPEN cur_rec;
FOR i IN 1..n LOOP
FETCH cur_rec into rec;
EXIT WHEN cur_rec%NOTFOUND;
END LOOP;
CLOSE cur_rec;
RETURN rec;
END;
-OUTPUT
SQL> SET SERVEROUT ON
SQL>
SQL> DECLARE
2 rec pack_rec_cur.rec_type;
3 BEGIN
4 rec := fun_rec_cur (6); --you get the 6th record in order of ename desc
5 DBMS_OUTPUT.put_line ('ename::' || rec.NAME || ' sal ::' || rec.sal);
6 END;
7 /
ename::MARTIN sal ::1250
PL/SQL procedure successfully completed.
SQL> -
Trying to write an if statement around the return value of a CANCEL_OPTION
I am writing a program that takes an input String using JOptionPane. The String can be made of only letters of the A-Z alphabet and the space character. I have written an error-checking loop that will pop another input box up along with an error message if any invalid character is detected. The input box has an 'ok' button and a 'cancel' button. As it is, if you hit cancel, the program crashes and you get a NullPointerException. All I want to do is place an if statement inside of the error-checking loop, immediatly after the code to pop up the second input box, that simply does System.exit() and exits the program correctly(rather than crashing) if 'cancel' is clicked.
My attempt at such an if statement is visible in the following code(letter is a boolean variable defined earlier, and message is the input String that has already been read in):
letter = isValidMessage(message);
while(!letter)
message = JOptionPane.showInputDialog(null, "Message must contain only A-Z, a-z, or space character...");
if(JOptionPane.CANCEL_OPTION > 0 //or ==0 or ==1 or ==2, nothing works//)
JOptionPane.showMessageDialog(null, "No valid message entered - program will terminate...");
System.exit(JOptionPane.CANCEL_OPTION);
letter = isValidMessage(message);
}The if statement doesn't work correctly. If you click 'cancel' when the input box comes up, the program does terminate as it is supposed to. The problem is that if I type something in the box and click 'ok', it also causes the program to terminate rather than continuing. I've tried changing the > to ==. I've tried changing 0 to 1 to 2 to -1(I really am not sure which int return value of CANCEL_OPTION corresponds to which event). I think once I got to do the exact opposite...that is to say, it would continue on with the program whether I clicked 'cancel' or 'ok'. Which is equally bad. I don't know what I'm doing wrong.
It's probably something simple that I'm just overlooking.Well, here's what CANCEL_OPTION is, according to the JOptionPane class:
/** Return value from class method if CANCEL is chosen. */
public static final int CANCEL_OPTION = 2;However, I believe you're going about this in the wrong way.
With JOptionPane, whenever you show a dialog, it usually returns whatever OPTION the user chose.
For instance,
int choice = JOptionPane.showConfirmDialog(parentComponent, "hello");That will bring up a dialog centered on parentComponent, with a message of "hello".
It will have the default options (YES_NO_OPTION).
What it returns is the option the user chose.
There are 4 possible things it can return:
YES_OPTION, when user clicks "Yes"
NO_OPTION, when user clicks "No"
ERROR_OPTION, when an unforseen error occurs and the dialog closes
CANCEL_OPTION, when the user clicks "Cancel" (if that OPTION type were being used), or if they close the dialog
So this is how you would check for CANCEL_OPTION:
int choice = JOptionPane.showConfirmDialog(parentComponent, "hello");
if (choice == JOptionPane.CANCEL_OPTION) {
// User cancelled
else if (choice == JOptionPane.YES_OPTION) {
// User chose yes
// EtcSo you see, going about it like this:
if(JOptionPane.CANCEL_OPTION > 0 //or ==0 or ==1 or ==2, nothing works//)Is really the wrong way, because you're not checking what the user DID, but just what the constant variable "CANCEL_OPTION" is.
However, it seems as if you're in a unique situation where you don't want the OPTION chosen by the user, but an input String.
This is all well and good, but I think this limits how you can interact with the user, as the "showInputDialog" methods return the String the user input- not the OPTION they chose, and you need to use both.
What I've done in the past is created a simple JPanel with its own JTextField.
I pass the JPanel in as the "message" parameter of a showConfirmDialog call, and get both the user input and their chosen OPTION based off a getText call to the JTextField and the OPTION constant returned by showConfirmDialog.
Basically,
JPanel promptPanel = new JPanel(new BorderLayout());
JTextField promptField = new JTextField();
promptPanel.add(promptField, BorderLayout.CENTER);
int choice = JOptionPane.showConfirmDialog(parentComponent, promptPanel, "Input", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (choice == JOptionPane.OK_OPTION) {
// User chose OK, see if invalid characters were entered
String input = promptField.getText();
else if (choice == JOptionPane.CANCEL_OPTION) {
// User cancelled
}Hope that helps.
(note that I'm unsure if showConfirmDialog can accept OK_CANCEL_OPTION as its OPTION parameter, as it says only YES_NO_OPTION and YES_NO_CANCEL_OPTION can be used, but I seem to remember using it in the past. if OK_CANCEL_OPTION doesn't want to work, then use one of the other two and adjust your if statements accordingly)
Cheers!
Edited by: LukeFoss on Oct 9, 2007 10:39 PM -
Trouble referencing return values of a Function in Stored Procedure
Hello all,
I have the following Function and Stored Procedure (simplified for this post). The error I am getting is in the SELECT, WHERE clause of the UPDATE command. My function is returning a sys_refcursor and I am trying to reference column names but keep getting the error
ORA-00904: "PUBLISHEDDOCVERSIONID": invalid identifier
What am I doing wrong?
Function
CREATE OR REPLACE FUNCTION &HKDB_Schema_Name..QueryKnowdeDocVersion(aKGID int)
RETURN sys_refcursor
IS
aCur sys_refcursor;
BEGIN
OPEN aCur FOR
SELECT pkd.KnowdeID as "PublishedKnowdeID", pkd.DocumentID as "PublishedDocID", pkd.VersionID as "PublishedDocVersionID"
FROM KnowdeDocument pkd
WHERE pkd.KGID = aKGID;
RETURN aCur;
END;Stored Procedure
UPDATE KnowdeDocument
SET DocumentID = (SELECT PublishedDocID FROM (SELECT QueryKnowdeDocVersion(aKGID, aPublishedKGID, aTextVersionID) FROM DUAL)
WHERE PublishedKnowdeID = KnowdeDocument.KnowdeID
AND PublishedDocID = KnowdeDocument.DocumentID
AND ((PublishedDocVersionID is NULL and KnowdeDocument.VersionID is NULL) OR (PublishedDocVersionID is not NULL AND
PublishedDocVersionID = KnowdeDocument.VersionID)))Regards,
TobyHi redeye,
Your select is from:
(select queryknowdedocversion(akgid
,apublishedkgid
,atextversionid)
from dual)This has no publisheddocversionid. Unfortunately I cannot figure out what you are trying to do with that ref_cursor.
Edit:
Or perhaps publisheddocversionid is a column in KnowdeDocument? Could this be case sensitive as well? (Bad idea to use quotations when naming things)
Regards
Peter
Edited by: Peter on Aug 24, 2009 3:39 AM -
Execution flow doesn't wait for return values
I have created JNI wrappers for existing dlls. However I'm getting weird behavior. My Java function calls a c function which communicates with an old mainframe. If I retrieve one row at a time its fine but if I do a loop the virtual machine crashes. Sometimes, if I add an empty loop for (30000 iterations) then its fine. Its like java is already trying to retrieve the next row while the first row is still being printed on my screen. I've tried adding synchronized in case the dlls where multi-threaded but it has not made a difference. Is there any way to control the execution flow so that it can't go to the next line until the values are truly returned from the c dll.
thanks
MAThere are many function being called on the native side. Since I didn't want to modify the native side
(because the old dlls are used by another application), I added my own dll as an intermediary between the old c dlls and the java side.
To fix the problem I am having, I've heard of another project where the native side would write the returned values to a file and only once the file is written can the Java side continue. Is this the only way to control the execution flow?
Right now I have about 5 empty loops which run to 100000 and things work most of the time. But I would prefer to find a way to say wait until the values are returned correctly.
Essentially, what I'm doing is
for (int i=1;i<10; i++){
test.init(Integer.toString(i),Integer.toString(i),"english desc"+ Integer.toString(i),"french desc"+ Integer.toString(i));
test.execute(test.ActionAdd);
}This is supposed to add one row with four fields. I'm just putting junk for the test. If I call the two main lines
test.init(Integer.toString(i),Integer.toString(i),"english desc"+ Integer.toString(i),"french desc"+ Integer.toString(i));
test.execute(test.ActionAdd);just once it works fine but if I loop them then it crashes after a few loops. If I put a loop as shown below then it works fine. This is part of the code when I'm adding. Is it being looped 10 times from the code above.
jsession.scanTable(table,errorlist);
rtc = table.getRecordCount(errorlist);
if (rtc > 0)
publish(rtc+" records found.");
for(int i = 1; i <= rtc; ++i)
for (int j = 0; j < ElementName.size();j++)
publish((String)ElementName.get(j)+ ": " + table.getFieldByName((String)ElementName.get(j),i,errorlist));
for (int k = 0; k<100000;k++);
else
publish("No records found.");
}In the code, when the rows are added, I print them out just to make sure they were added correctly. This is where I got the idea that the Java code was not in synch with the native side because it would crash while writting out a line but it didn't happen every time at the same place.
This is the function getFieldByName
public String getFieldByName (String p_FieldName, int p_LineNum, ErrorList p_Errors)
String retval = "";
int ret;
try
p_FieldName = prepareFieldName(p_FieldName);
retval = new String();
ret = 0;
if (this.ptrTableView == NOT_SET)
p_Errors.addMessage(p_Errors.SEV_SYSTEM_ERROR(), "Table View Pointer not set");
throw (new Exception());
// allocating string buffer for value returned
StringBuffer m_FieldValue = new StringBuffer();
// determining length of value
int m_length[] = {0};
ret = gti.GetFieldLen(this.ptrTableView, p_FieldName, m_length, eb.getErrorBlockPtr());
if (m_length[0] == 0) m_length[0] = 100;
m_FieldValue = new StringBuffer(m_length[0]);
// get line field
ret = gti.GetLineField(this.ptrTableView, p_FieldName, p_LineNum, m_FieldValue, eb.getErrorBlockPtr());
if (ret != 0)
p_Errors.addMessage(p_Errors.SEV_ERROR(), "Error retrieving field value ("+p_FieldName+")");
else
retval = m_FieldValue.toString();
catch (Throwable t)
p_Errors.addMessage(p_Errors.SEV_ERROR(), "Error retrieving field value ("+p_FieldName+")");
return retval;
}The main functions are
GetFieldLen
GetLineField
They go to the native side through my dll which wraps the old dlls.
Here are is one of the main functions in my dll. I also have the source for the functions they are calling but they are calling other functions which are calling other functions. There is a lot of code . Yes, they use arrays.
JNIEXPORT jint JNICALL Java_advantagewrapperspk_GtiNative_GtiGetLineField
(JNIEnv *env, jclass cls, jint p_tableViewPtr, jstring VIEWFIELDNAME, jint VIEWFIELDNUM, jobject VIEWFIELDVALUE, jint iErrBlockPtr)
//printf("\n\nGtiGetLineField in C:\n");
jint iResult = 0;
char *temp1 = (*env)->GetStringUTFChars(env,VIEWFIELDNAME,0);
char *temp2 = (*env)->GetStringUTFChars(env,VIEWFIELDVALUE,0);
iResult = GtiGetLineField(p_tableViewPtr,temp1,VIEWFIELDNUM,temp2,iErrBlockPtr);
//printf("VIEWFIELDNUM %d ",VIEWFIELDNUM);
//printf("\ntemp1 %s ",temp1);
//printf("\ntemp2 %s ",temp2);
(*env)->ReleaseStringUTFChars(env,VIEWFIELDNAME,temp1);
if (temp2 == 0) return iResult;
if (temp2 != NULL)
cls = (*env)->GetObjectClass(env,VIEWFIELDVALUE);
jmethodID mid = (*env)->GetMethodID (env,cls,"append","(Ljava/lang/String;)Ljava/lang/StringBuffer;");
if (mid == 0) return iResult;
jstring sfinal = (*env)->NewStringUTF (env, temp2);
(*env)->CallObjectMethod(env,VIEWFIELDVALUE,mid,sfinal);
if (VIEWFIELDVALUE != NULL) (*env)->ReleaseStringUTFChars(env,VIEWFIELDVALUE,temp2);
//(*env)->ReleaseStringUTFChars(env,VIEWFIELDVALUE,temp2);
return iResult;
}This calls
* Function Name : GtiGetLineField()
* Description : Retrieves the value of a line field in a table view
* Parameters : pTableViewPtr pTableView--the table view from which to
* retrieve the value of a line
* field
* VIEWFIELDNAME szFieldName--the name of the line field
* whose value is returned
* VIEWLINENUM iLineNum--number of line from which to retrieve
* field value. Lines are numbered
* beginning with 1.
* VIEWFIELDVALUE szFieldValue--returns the value of the
* line field
* ErrBlockPtr sourceeb--error context info from calling
* function
* Return values : int--returns RCT_RETURNOK, RCT_WARNCORECONNECT, or
* RCT_FAILCORECONNECT
* Modifications : REH - 05/25/93
int GtiGetLineField ( TableViewPtr pTableView,
VIEWFIELDNAME szFieldName,
VIEWLINENUM iLineNum,
VIEWFIELDVALUE szFieldValue,
ErrBlockPtr sourceeb )
int iRc ; /* return code */
ELOG_INIT( sourceeb,
"GtiGetLineField",
"retrieving the value of a line field in a table view" ) ;
/* in Gti, we start numbering lines from 1, because that is the way a user
sees them on the screen. In Ldm, following C conventions, we start
numbering lines at 0. So in LdmSetField, we subtract 1 from iLineNum */
iRc = LdmGetField( pTableView->pTran,
szFieldName,
szFieldValue,
iLineNum - 1,
0, /* map occurrence = 1 */
ELOG_ERRBLOCK ) ;
/* in case Ldm returned a warning, indicate so to the calling function */
iRc = ( iRc == LDM_RETURNOK ) ? RCT_RETURNOK : RCT_WARNCORECONNECT ;
return( iRc ) ;
/* if exception was raised, it was due to COREConnect */
ELOG_END( RCT_FAILCORECONNECT ) ;
}which calls
/****************************** API Header *********************************\
* API Name: LdmGetField
* This function copies the string value of a specified FIELDNAME into a
* buffer specified by FIELDVALUE. The string is NULL terminated.
* The first OCCUR determines which occurrence of the field in the map.
* The second OCCUR determines which occurence of the map in the transaction
* area. Remember that occurrences are numbered like C arrays: a transaction
* with ten occurrences of a field will have fields numbered zero through
* nine.
* It is assumed that FIELDVALUE has enough space to accommodate the field's
* value.
int LdmGetField( HTRAN htran,
FIELDNAME fieldname,
FIELDVALUE fieldvalue,
FIELDOCCUR fieldoccur,
MAPOCCUR mapoccur,
ErrBlockPtr seb )
ELOG_INIT ( seb, "LdmGetField", "getting transaction field value" ) ;
if ( htran->Occurrence <= mapoccur ) {
ElogFail1( LDM_FAILOCCNOTFOUND, htran->TranName ) ;
} /* END if. */
/* Since 'blank' values for field or map occurrences are zero, there
is no need to set a default. */
LdmsGetField( htran->Map->CCMap,
htran->TranData,
fieldname,
fieldvalue,
fieldoccur,
mapoccur,
ELOG_ERRBLOCK ) ;
return( LDM_RETURNOK ) ;
ELOG_END ( ELOG_ERRBLOCK->Rc ) ;
} /* END LdmGetField. */which calls
/****************************** API Header *********************************\
* API Name: LdmsGetField
* Put the value of FIELDNAME into FIELDVALUE. The field must be an element
* of the specified map. The new value will be set in the specified data
* buffer. The occurrences refer to the occurrence of the field in the map
* and the occurrence of the map in the data buffer.
int LdmsGetField ( CCMapPtr rcmap,
char *dataarea,
FIELDNAME fieldname,
FIELDVALUE fieldvalue,
FIELDOCCUR fieldoccur,
MAPOCCUR mapoccur,
ErrBlockPtr seb )
ElementPtr element ;
char *fieldoffset ;
ELOG_INIT ( seb, "LdmsGetField", "getting a field of a map" ) ;
/* Search the transaction definition area (map) for matching
FIELDNAME. If found, copy FIELDVALUE to defined offset in
transaction buffer. */
element = LdmsFindField( rcmap, fieldname, fieldoccur, &localeb ) ;
/* Copy the value from the transaction data area into FIELDVALUE. */
fieldoffset = dataarea +
( ( rcmap->BufferLength * mapoccur ) + element->Offset ) ;
strncpy( fieldvalue, fieldoffset, element->Length ) ;
fieldvalue[ element->Length ] = '\0' ;
return( LDM_RETURNOK ) ;
ELOG_END ( ELOG_ERRBLOCK->Rc ) ;
} /* END LdmsGetField. */and on it goes
I gather from your question about arrays that they might be the source of the problem. Could it be that the pointer to the array is returned while the array is not completed? Any information would help. Thanks. -
Return 2 values (string, number) multiple rows, from java stored function
I would like to return 2 values (String, number prefered but String, String will work) from a java stored function.
I was able to successfully return a varray of varchar2 values but I was wondering if it is possible to return 2 values by using a varray?
Is it even possible? I tried using combinations of types which included a varray of objects (with 2 attributes) or a type as table of objects but I couldn't figure out how in my java code to set these values. Also what would my java function return type be and what Oracle type would map to it?
Any help and examples or pointers would be great.
Thanks,
DennisThanks to all. I finally figured it out through all the pieces on the web.
Here is what worked for me. First create 2 oracle types. One object type to represent the "columns" I will pass back:
CREATE OR REPLACE TYPE COST_OBJ AS OBJECT (COST_NAME NVARCHAR2(50), COST_VALUE number ) NOT FINAL
note: make sure the "strings" are defined as NVARCHAR2 or Java will puke if it is just VARCHAR2.
Then create a table type to hold your objects defined as following:
CREATE OR REPLACE TYPE COST_OBJ_TABLE is table OF COST_OBJ
Then create the oracle stored function that is a wrapper to the java function:
CREATE OR REPLACE FUNCTION get_Costs(Name VARCHAR2, evalDate VARCHAR2, fuelCodeID NUMBER) return COST_OBJ_TABLE
is language java name
'com.costs.storedProcedures.Cost.getCosts(java.lang.String, java.lang.String, int) return oracle.sql.ARRAY'
Once that is done, Oracle is ready. The Java function looks something like this:
public ARRAY getCosts(String name, String evalDate, int fuelCodeID) {
DBAccess da = getDBAccess();
// get a handle on the connection
Connection conn = da.getConnection();
// The stuff that will be returned should be as type object array
// make it to the size of the number of fuelcomponents passed in
Object[] returnStuff = new Object[3];
// create the type of struct that is defined on the database
StructDescriptor structDesc =
StructDescriptor.createDescriptor("CY_UMAP.COST_OBJ", conn);
for (int i = 0; i < returnStuff .size(); i++) {
Object[] costValues = new Object[]{
"This is object " + i,
new Integer ( i ) };
STRUCT cost_obj = new STRUCT(structDesc, conn, costValues);
returnStuff[i] = cost_obj;
ArrayDescriptor x_ad = ArrayDescriptor.createDescriptor (
"CY_UMAP.COST_OBJ_TABLE", conn);
ARRAY x_array = new ARRAY(x_ad, conn, returnStuff);
return x_array;
I hope this helps others.
Dennis -
Previous task was:
Write a class "QuestionAnalyser" which has a method "turnAnswerToScore". This method takes a String parameter and returns an int. The int returned depends upon the parameter:
parameter score
"A" 1
"B" 2
"C" 3
other 0
Alright, here's the recent task:
Write another method "turnAnswersToScore". This method takes an array of Strings as a parameter, works out the numerical score for each array entry, and adds the scores up, returning the total.
That's my code:
class QuestionAnalyser{
public static int Score;
public String[] Answer;
public static void main(String[] args) {}
public int turnAnswerToScore(String[] Answer)
for (int i = 0; i < Answer.length;i++) {
if (Answer.equals("A")) {
Score = Score + 1; }
else if (Answer[i].equals("B")) {
Score = Score + 2;}
else if (Answer[i].equals("C")) {
Score = Score + 3;}
else {
Score = Score + 0;}
return Score;
this is the error message I get:
The results of trying to compile your submission and run it against a set of test data was as follows:
----------Compilation output--------------------------------------
javac QATest2.java
QATest2.java:15: cannot resolve symbol
symbol : method turnAnswersToScore (java.lang.String[])
location: class QuestionAnalyser
if(qa.turnAnswersToScore(task)!=total){
^
What went wrong?
Suggestions would be greatly appreciated!If I declare int score in the method i get this message
The results of trying to compile your submission and run it against a set of test data was as follows:
----------Compilation output--------------------------------------
javac QATest2.java
./QuestionAnalyser.java:20: variable score might not have been initialized
score++; }
^
./QuestionAnalyser.java:23: variable score might not have been initialized
score++;
^
./QuestionAnalyser.java:27: variable score might not have been initialized
score++;
^
./QuestionAnalyser.java:34: variable score might not have been initialized
return score;
^
4 errors
----------Sorry expected answer was-------------------------------
The method turnAnswersToScore is working OK - well done!
----------Your answer however was---------------------------------
Exception in thread "main" java.lang.NoClassDefFoundError: QuestionAnalyser
at QATest2.main(QATest2.java:4)
This is the message I get from the submission page, but trying to compile it I get the same messages.
The code looks like this, then
class QuestionAnalyser{
String[] answer;
public static void main(String[] args) {}
public int turnAnswersToScore(String[] answer)
int score;
for (int i = 0; i < answer.length; i++) {
if (answer.equals("A")) {
score++; }
else if (answer[i].equals("B")) {
score++;
score++; }
else if (answer[i].equals("C")) {
score++;
score++;
score++; }
else {}
return score;
When I leave 'public int score;' where it was before (right after the class declaration below the declaration of the string array) I get this but it compiles normally.
The results of trying to compile your submission and run it against a set of test data was as follows:
----------Compilation output--------------------------------------
javac QATest2.java
----------Sorry expected answer was-------------------------------
The method turnAnswersToScore is working OK - well done!
----------Your answer however was---------------------------------
wrong answer in turnAnswersToScore for
BDCAADDCA
Alright, even university students need to sleep :-)
Good night. -
Greetings and Salutations,
I'm having speed issues with my Adobe AIR application. From what I've read on the web, AIR is supposed to be fast at drawing graphics. I am writing an application which has multiple screens. On one of the screens I have a tab (SuperNavigator) which has a canvas on it. That canvas has a series of other canvases (built with a repeater) that have graphics in them. I am having speed issues when I have more than 50 of these children canvases. I've tried running it without the graphics (code below is without the graphics) to see how it performs. When I have 954 of these canvases being drawn it takes about 2.5 minutes to draw. This is unacceptable and I'm wondering if this is something I've induced or if AIR was never meant to handle such a large amount of canvases (actually this isn't a large amount, in a real world environment there could be a lot more). I've included relevant clips from the code. There are a couple empty boxes that in the real application will hold graphics.
The class withing the Tab Navigator is a canvas.
In the action Script (the setter line takes 2.5 minutes to get past) (it's binding to the repeater that seems to be my problem).
[Bindable] private
private var _assetList:Array;
[Bindable]
public function get timelineAssetList():Array{
return this._assetList;
public function set timelineAssetList(ac:Array):void{
this._assetList = ac;
The MXML code that is being bound to:
<mx:Canvas id="labelCanvas" left="0" right="0" top="0" height="65" verticalScrollPolicy="off" scroll="scrolling(event)">
<mx:HBox horizontalGap="1" left="10" right="10" top="10">
<mx:Spacer width="2"/>
<mx:Canvas width="{getHeaderWidth()}" height="40" borderStyle="solid" borderColor="{StaticVariables.borderColor.getColorUint()}" horizontalCenter="0">
<PastDataView:ColorBarScale id="scale" bottom="10"/>
</mx:Canvas>
<mx:Canvas width="20" height="40">
<mx:Spacer width="20" />
</mx:Canvas>
</mx:HBox>
</mx:Canvas>
<mx:Canvas id="assetCanvas" left="0" right="0" bottom="0" top="65" scroll="scrolling(event)">
<mx:VBox y="10" right="16" left="10" verticalGap="0">
<mx:Repeater id="assetRepeater" dataProvider="{timelineAssetList}">
<mx:HRule width="100%"/>
<PastDataView:ColorBarBar id="barArray" width="100%" height="170" asset="{assetRepeater.currentItem}"/>
</mx:Repeater>
</mx:VBox>
</mx:Canvas>
The ColorBarBar consists of:
<?xml version="1.0" encoding="utf-8"?><mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" xmlns:PastDataView="org.XXXXXX.CenterScreen.PastDataView.*" horizontalScrollPolicy="off" click="clicked()">
[Bindable]
public static var _colorBarHeight:int = StaticVariables.colorBarHeight;
[Bindable]
private var _asset:Object;
[Bindable]
public function set asset(a:Object):void{
this._asset = a; getBackgroundColor();
public function get asset():Object{
return _asset; }
private function getBackgroundColor():void {
var color:String = asset.color;
if (color == null) color = "Black";
if( color.toLowerCase() == "blue" ) {
lblAssetTag.setStyle("color", 0x1674cc); lblAsset.setStyle(
"color", 0x1674cc); }
else if( color.toLowerCase() == "red" ) {
lblAssetTag.setStyle("color", 0xe35353); lblAsset.setStyle(
"color", 0xe35353); }
else if(color.toLowerCase() == "grey" || color.toLowerCase() == "gray") { lblAssetTag.setStyle(
"color", 0xe55555); lblAsset.setStyle(
"color", 0xe55555); }
else { // give it a default color lblAssetTag.setStyle(
"color", 0x000000); lblAsset.setStyle(
"color", 0x000000); }
private function calculateActivityRepeaterHeight():int{
return this.height-50-_colorBarHeight; }
public function clicked():void{
dispatchEvent(new SelectAssetEvent(this._asset, false, false, true)); }
]]> </mx:Script>
<mx:VBox left="0" top="0" right="0">
<mx:Spacer height="1"/>
<mx:HBox>
<mx:Spacer width="2"/> <mx:Label id="lblAssetTag" text="{asset.type}: " fontWeight="bold" fontSize="12" doubleClickEnabled="true" doubleClick="titleClicked()"/> id="lblAssetTag" text="{asset.type}: " fontWeight="bold" fontSize="12" doubleClickEnabled="true" doubleClick="titleClicked()"/> id="lblAssetTag" text="{asset.type}: " fontWeight="bold" fontSize="12" doubleClickEnabled="true" doubleClick="titleClicked()"/>
<mx:Label id="lblAsset" text="{asset.name}" fontSize="12" doubleClickEnabled="true" doubleClick="titleClicked()"/>
<mx:Label id="lblAssetId" text="{'(' + asset.id + ')'}" fontSize="12" visible="{mx.core.Application.application.debugMode}"/>
</mx:HBox>
<mx:HBox horizontalGap="1">
<mx:Spacer width="2"/>
<mx:Spacer width="10" />
<mx:VBox width="100%"> <mx:VBox>
</mx:VBox>
<mx:VBox id="displays" verticalScrollPolicy="auto" height="{calculateActivityRepeaterHeight()}" horizontalScrollPolicy="off">
</mx:VBox>
</mx:VBox>
</mx:HBox>
<mx:Spacer height="2"/>
</mx:VBox></mx:Canvas>
I would appreciate any thoughts or feedback you could provide.
~martinThe Canvas is a very heavy object that has lots of overhead. Even worse is the VBox object that is in there multiple times.
What exactally are you trying to accomplish? Just looking over the code, it seems that the same could be done directly with the Graphics API, at a much faster rate.
For each of the VBoxes and Canvases you have, the entire size of each child and parent need to be re-evalulated each time you add or change something. This is a HUGE overhead, and probably why the app is running so slow. You may need to convert this app to use simpler objects (UIComponent or something lower-level like that) to get any speed.
Are you using Flex Bulder? Take a look at the app while the Profiler is running to see what I'm talking about. -
How do i pass a variable in flex
i've been looking all over google for how to pass a variable yet
i've come up empty handed
i have a C code and as3
i've never been able to get a C program to compile on my own, this is from a tutorial im trying to understand about raycasting
from what i can gather i think that the variables are passed threw this
#######raycaster.c##########
AS3_Val loop( void* self, AS3_Val args )
AS3_ArrayValue(args,"IntType,IntType,IntType,IntType",&K_UP,&K_DOWN,&K_LEFT,&K_RIGHT);
CastRay();
int opos,j,i,jpos;
for(j=0; j < resY; j++ ){
jpos = resX*j;
for(i=0; i < resX; i++ ){
opos = (jpos+i);
tBuffer[opos] = buffer[i][j];
}//end of for
}//end of for
return 0;
}//end of loop
however not one of the values inside of AS3_ArrayValue is to be found on the Main.as
this is the only function that comunicates with the C code, but i could be wrong
####Main.as######
private function enterFrame(event:Event):void {
alcRCLib.loop(upKey,downKey,leftKey,rightKey);
alchemyMemory.position=alcScreenBufferPointer;
screenBitmapData.setPixels(screenBitmapData.rect,alchemyMemory);
the reason i want to do this, other than to know how, because that would be useful above all else, i've already written a as3 that comunicates with php
to get a array of images for a topdown game, and i wouldn't know how to load these variables to C from a HTTP request but if i can get flash to tell c what they are then every thing worked out
heres both codes in full
#####Main.as####
*Alchemy Ray Caster
*April 6, 2010
*Bruce Jawn
*http://bruce-lab.blogspot.com
*Copyright (c) <2010> <Bruce Jawn>
*This software is released under the MIT License
*<http://www.opensource.org/licenses/mit-license.php>
package {
// import cmodule.Ray_Caster._worldMap;
// import cmodule.Ray_Caster._worldMap;
import cmodule.Ray_Caster.CLibInit;
// import cmodule.Ray_Caster.TextFieldI;
import flash.display.*;
import flash.text.*;
import flash.events.*;
import flash.geom.*;
import flash.text.engine.TextBlock;
import flash.text.engine.TextLine;
import flash.text.TextField;
import flash.utils.*;
import flash.ui.*;
[SWF(width="840", height="880")]
public class Main extends Sprite {
[Embed(source="../wolftex/barrel.png")]
public static var barrelClass:Class;
[Embed(source="../wolftex/bluestone.png")]
public static var bluestoneClass:Class;
[Embed(source="../wolftex/colorstone.png")]
public static var colorstoneClass:Class;
[Embed(source="../wolftex/eagle.png")]
public static var eagleClass:Class;
[Embed(source="../wolftex/greenlight.png")]
public static var greenlightClass:Class;
[Embed(source="../wolftex/greystone.png")]
public static var greystoneClass:Class;
[Embed(source="../wolftex/mossy.png")]
public static var mossyClass:Class;
[Embed(source="../wolftex/pillar.png")]
public static var pillarClass:Class;
[Embed(source="../wolftex/purplestone.png")]
public static var purplestoneClass:Class;
[Embed(source="../wolftex/redbrick.png")]
public static var redbrickClass:Class;
[Embed(source="../wolftex/wood.png")]
public static var woodClass:Class;
//Array to hold all the textures
private var texs:Array=[];
private var worldMap:Array = [];
//private var worldMap[1]:Array=[];
private static const SCREEN_WIDTH:int=640;
private static const SCREEN_HEIGHT:int=480;
private var screenBitmapData:BitmapData;
private var screenBitmap:Bitmap;
private var alchemyMemory:ByteArray;
private var alcRCLib:Object;
private var cLibInit:CLibInit;
private var alcScreenBufferPointer:uint;
private var alcTexPointer:uint;
private var upKey:int=0;
private var downKey:int=0;
private var leftKey:int=0;
private var rightKey:int=0;
private var a:flash.text.TextField;
public function Main() {
stage.frameRate=60;
stage.align=StageAlign.TOP_LEFT;
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.fullScreenSourceRect=new Rectangle(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
init();
}//end of function Main
private function init():void {
initBitmaps();
initAlchemy();
initRendering();
}//end of function init
private function initBitmaps():void {
texs.push(prepareBitmapData(new eagleClass().bitmapData ));
texs.push(prepareBitmapData(new redbrickClass().bitmapData ));
texs.push(prepareBitmapData(new purplestoneClass().bitmapData ));
texs.push(prepareBitmapData(new greystoneClass().bitmapData ));
texs.push(prepareBitmapData(new bluestoneClass().bitmapData ));
texs.push(prepareBitmapData(new mossyClass().bitmapData ));
texs.push(prepareBitmapData(new woodClass().bitmapData ));
texs.push(prepareBitmapData(new colorstoneClass().bitmapData ));
texs.push(prepareBitmapData(new barrelClass().bitmapData ));
texs.push(prepareBitmapData(new pillarClass().bitmapData ));
texs.push(prepareBitmapData(new greenlightClass().bitmapData ));
screenBitmapData=new BitmapData(SCREEN_WIDTH,SCREEN_HEIGHT,false,0);
screenBitmap=new Bitmap(screenBitmapData);
addChild(screenBitmap);
worldMap[1] = (1,2,3,4);
worldMap[2] = (1,2,3,4);
worldMap[3] = (1,2,3,4);
worldMap[4] = (1,2,3,4);
worldMap[5] = (1,2,3,4);
worldMap[6] = (1,2,3,4);
worldMap[7] = (1,2,3,4);
}//end of function initBitmaps
//Prepare the bitmap once to take into account the lower-endianess of the alchemy code.
private function prepareBitmapData(sourceMap:BitmapData):BitmapData {
var outBitmapData:BitmapData=sourceMap.clone();
outBitmapData=new BitmapData(outBitmapData.width,outBitmapData.height,true,0xFF000000);
outBitmapData.copyChannel(sourceMap,outBitmapData.rect,outBitmapData.rect.topLeft,BitmapD ataChannel.ALPHA,BitmapDataChannel.BLUE);
outBitmapData.copyChannel(sourceMap,outBitmapData.rect,outBitmapData.rect.topLeft,BitmapD ataChannel.RED,BitmapDataChannel.GREEN);
outBitmapData.copyChannel(sourceMap,outBitmapData.rect,outBitmapData.rect.topLeft,BitmapD ataChannel.GREEN,BitmapDataChannel.RED);
outBitmapData.copyChannel(sourceMap,outBitmapData.rect,outBitmapData.rect.topLeft,BitmapD ataChannel.BLUE,BitmapDataChannel.ALPHA);
return outBitmapData;
}//end of function prepareBitmapData
private function initAlchemy():void {
cLibInit=new CLibInit ;
alcRCLib=cLibInit.init();
//Retrieve the "Alchemy Memory".
var ns:Namespace=new Namespace("cmodule.Ray_Caster");
alchemyMemory=ns::gstate.ds;
//Allocate the buffers in Alchemy.
alcScreenBufferPointer=alcRCLib.initializeScreenBuffer(SCREEN_WIDTH,SCREEN_HEIGHT);//Setu p a screenbuffer of size x,y;
//Copy the textures to alchemy memory.
for (var i:int=0; i<11; i++) {
var ba:ByteArray=texs[i].getPixels(texs[i].rect);
alcTexPointer=alcRCLib.initializeTexBuffer(i);
alchemyMemory.position=alcTexPointer;
alchemyMemory.writeBytes(ba,0,ba.length);
}//end of for
}//end of function initAlchemy
private function initRendering():void {
stage.addEventListener(KeyboardEvent.KEY_DOWN,key_pressed);
stage.addEventListener(KeyboardEvent.KEY_UP,key_released);
addEventListener(Event.ENTER_FRAME,enterFrame);
}//end of function initRendering
private function enterFrame(event:Event):void {
alcRCLib.loop(upKey,downKey,leftKey,rightKey);
alchemyMemory.position=alcScreenBufferPointer;
screenBitmapData.setPixels(screenBitmapData.rect,alchemyMemory);
}//end of function enterFrame
private function key_pressed(e:KeyboardEvent):void {
switch (e.keyCode) {
case Keyboard.UP :
upKey=1;
break;
case Keyboard.DOWN :
downKey=1;
break;
case Keyboard.LEFT :
leftKey=1;
break;
case Keyboard.RIGHT :
rightKey=1;
break;
}//end of switch
}//end of function key_pressed
private function key_released(e:KeyboardEvent):void {
switch (e.keyCode) {
case Keyboard.UP :
upKey=0;
break;
case Keyboard.DOWN :
downKey=0;
break;
case Keyboard.LEFT :
leftKey=0;
break;
case Keyboard.RIGHT :
rightKey=0;
break;
}//end of switch
}//end of function key_released
}//end of class
}//end of package
###raycaster####
//Raycasting Engine from Lode's Computer Graphics Tutorial
//http://www.student.kuleuven.be/~m0216922/CG/raycasting.html
//Modified for Alchemy by Bruce Jawn
//http://bruce-lab.blogspot.com
#include "AS3.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//============================================================
//============================================================
enum bool {false=0,true=!false};
#define screenWidth 1640
#define screenHeight 1480
#define texWidth 64
#define texHeight 64
#define mapWidth 24
#define mapHeight 24
//1D Screen Buffer
int* tBuffer;
int resX = 0;
int resY = 0;
//2D Screen Buffer
int buffer[screenWidth][screenHeight];
//1D Zbuffer
double ZBuffer[screenWidth];
//============================================================
//============================================================
//textures
int texture[11][texWidth*texHeight];
#define numSprites 19
//arrays used to sort the sprites
int spriteOrder[numSprites];
double spriteDistance[numSprites];
struct SSprite
double x;
double y;
int texture;
struct SSprite sprite[numSprites]=
//green light in front of playerstart
{20.5, 11.5, 10},
//green lights in every room
{18.5,4.5, 10},
{10.0,4.5, 10},
{10.0,12.5,10},
{3.5, 6.5, 10},
{3.5, 20.5,10},
{3.5, 14.5,10},
{14.5,20.5,10},
//row of pillars in front of wall: fisheye test
{18.5, 10.5, 9},
{18.5, 11.5, 9},
{18.5, 12.5, 9},
//some barrels around the map
{21.5, 1.5, 8},
{15.5, 1.5, 8},
{16.0, 1.8, 8},
{16.2, 1.2, 8},
{3.5, 2.5, 8},
{9.5, 15.5, 8},
{10.0, 15.1,8},
{10.5, 15.8,8},
//============================================================
//============================================================
//map
int worldMap[mapWidth][mapHeight] =
{8,8,8,8,8,8,8,8,8,8,8,4,4,6,4,4,6,4,6,4,4,4,6,4},
{8,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,0,0,0,0,0,0,4},
{8,0,3,3,0,0,0,0,0,8,8,4,0,0,0,0,0,0,0,0,0,0,0,6},
{8,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6},
{8,0,3,3,0,0,0,0,0,8,8,4,0,0,0,0,0,0,0,0,0,0,0,4},
{8,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,6,6,6,0,6,4,6},
{8,8,8,8,0,8,8,8,8,8,8,4,4,4,4,4,4,6,0,0,0,0,0,6},
{7,7,7,7,0,7,7,7,7,0,8,0,8,0,8,0,8,4,0,4,0,6,0,6},
{7,7,0,0,0,0,0,0,7,8,0,8,0,8,0,8,8,6,0,0,0,0,0,6},
{7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,4},
{7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,6,0,6,0,6},
{7,7,0,0,0,0,0,0,7,8,0,8,0,8,0,8,8,6,4,6,0,6,6,6},
{7,7,7,7,0,7,7,7,7,8,8,4,0,6,8,4,8,3,3,3,0,3,3,3},
{2,2,2,2,0,2,2,2,2,4,6,4,0,0,6,0,6,3,0,0,0,0,0,3},
{2,2,0,0,0,0,0,2,2,4,0,0,0,0,0,0,4,3,0,0,0,0,0,3},
{2,0,0,0,0,0,0,0,2,4,0,0,0,0,0,0,4,3,0,0,0,0,0,3},
{1,0,0,0,0,0,0,0,1,4,4,4,4,4,6,0,6,3,3,0,0,0,3,3},
{2,0,0,0,0,0,0,0,2,2,2,1,2,2,2,6,6,0,0,5,0,5,0,5},
{2,2,0,0,0,0,0,2,2,2,0,0,0,2,2,0,5,0,5,0,0,0,5,5},
{2,0,0,0,0,0,0,0,2,0,0,0,0,0,2,5,0,5,0,5,0,5,0,5},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5},
{2,0,0,0,0,0,0,0,2,0,0,0,0,0,2,5,0,5,0,5,0,5,0,5},
{2,2,0,0,0,0,0,2,2,2,0,0,0,2,2,0,5,0,5,0,0,0,5,5},
{2,2,2,2,1,2,2,2,2,2,2,1,2,2,2,5,5,5,5,5,5,5,5,5}
//============================================================
//============================================================
double posX = 22.0, posY = 11.5; //x and y start position
double dirX = -1.0, dirY = 0.0; //initial direction vector
double planeX = 0.0, planeY = 0.66; //the 2d raycaster version of camera plane
int K_LEFT=0;
int K_RIGHT=0;
int K_UP=0;
int K_DOWN=0;
//speed modifiers
double moveSpeed = .30; //the constant value is in squares/second
double rotSpeed = .20; //the constant value is in radians/second
//============================================================
//============================================================
AS3_Val initializeScreenBuffer(void* self, AS3_Val args)
AS3_ArrayValue(args, "IntType, IntType", &resX, &resY);
tBuffer = malloc( resX * resY * sizeof(int) );
return AS3_Ptr( tBuffer );
}//end of initializeScreenBuffer
//used to load some textures & sprite textures
AS3_Val initializeTexBuffer(void* self, AS3_Val args)
int index;
AS3_ArrayValue(args, "IntType", &index);
return AS3_Ptr( texture[index] );
}//end of initializeTexBuffer
//start the main loop
AS3_Val loop( void* self, AS3_Val args )
AS3_ArrayValue(args,"IntType,IntType,IntType,IntType",&K_UP,&K_DOWN,&K_LEFT,&K_RIGHT);
CastRay();
int opos,j,i,jpos;
for(j=0; j < resY; j++ ){
jpos = resX*j;
for(i=0; i < resX; i++ ){
opos = (jpos+i);
tBuffer[opos] = buffer[i][j];
}//end of for
}//end of for
return 0;
}//end of loop
int main()
AS3_Val initializeScreenBufferMethod = AS3_Function( NULL,initializeScreenBuffer );
AS3_Val loopMethod = AS3_Function( NULL,loop );
AS3_Val initializeTexBufferMethod = AS3_Function( NULL,initializeTexBuffer );
AS3_Val result = AS3_Object("initializeScreenBuffer:AS3ValType,loop:AS3ValType,initializeTexBuffer:AS3ValT ype"
,initializeScreenBufferMethod,loopMethod,initializeTexBufferMethod);
AS3_Release( initializeScreenBufferMethod );
AS3_Release( loopMethod );
AS3_Release( initializeTexBufferMethod );
AS3_LibInit( result );
return 0;
}//end of main
//================================================================
//================================================================
void CastRay()
printf ("Hello World!\n");
int x;
int y;
int w=screenWidth;
int h=screenHeight;
for( x = 0; x < screenWidth; x++) for( y = 0; y < screenHeight; y++) {buffer[x][y] = 0;} //clear the buffer instead of cls()
for(x = 0; x < w; x++)
//calculate ray position and direction
double cameraX = 2 * x / (double)(w) - 1; //x-coordinate in camera space
double rayPosX = posX;
double rayPosY = posY;
double rayDirX = dirX + planeX * cameraX;
double rayDirY = dirY + planeY * cameraX;
//which box of the map we're in
int mapX = (int)(rayPosX);
int mapY = (int)(rayPosY);
//length of ray from current position to next x or y-side
double sideDistX;
double sideDistY;
//length of ray from one x or y-side to next x or y-side
double deltaDistX = sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX));
double deltaDistY = sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY));
double perpWallDist;
//what direction to step in x or y-direction (either +1 or -1)
int stepX;
int stepY;
int hit = 0; //was there a wall hit?
int side; //was a NS or a EW wall hit?
//calculate step and initial sideDist
if (rayDirX < 0)
stepX = -1;
sideDistX = (rayPosX - mapX) * deltaDistX;
}//end of if (rayDirX < 0)
else
stepX = 1;
sideDistX = (mapX + 1.0 - rayPosX) * deltaDistX;
}//end of else
if (rayDirY < 0)
stepY = -1;
sideDistY = (rayPosY - mapY) * deltaDistY;
}//end of if (rayDirY < 0)
else
stepY = 1;
sideDistY = (mapY + 1.0 - rayPosY) * deltaDistY;
}//end of else
//perform DDA
while (hit == 0)
//jump to next map square, OR in x-direction, OR in y-direction
if (sideDistX < sideDistY)
sideDistX += deltaDistX;
mapX += stepX;
side = 0;
}//end of if (sideDistX < sideDistY)
else
sideDistY += deltaDistY;
mapY += stepY;
side = 1;
}//end of else
//Check if ray has hit a wall
if (worldMap[mapX][mapY] > 0) hit = 1;
}//end of while (hit == 0)
//Calculate distance of perpendicular ray (oblique distance will give fisheye effect!)
if (side == 0) perpWallDist = fabs((mapX - rayPosX + (1 - stepX) / 2) / rayDirX);
else perpWallDist = fabs((mapY - rayPosY + (1 - stepY) / 2) / rayDirY);
//Calculate height of line to draw on screen
int lineHeight = abs((int)(h / perpWallDist));
//calculate lowest and highest pixel to fill in current stripe
int drawStart = -lineHeight / 2 + h / 2;
if(drawStart < 0) drawStart = 0;
int drawEnd = lineHeight / 2 + h / 2;
if(drawEnd >= h) drawEnd = h - 1;
//texturing calculations
int texNum = worldMap[mapX][mapY] - 1; //1 subtracted from it so that texture 0 can be used!
//calculate value of wallX
double wallX; //where exactly the wall was hit
if (side == 1) wallX = rayPosX + ((mapY - rayPosY + (1 - stepY) / 2) / rayDirY) * rayDirX;
else wallX = rayPosY + ((mapX - rayPosX + (1 - stepX) / 2) / rayDirX) * rayDirY;
wallX -= floor((wallX));
//x coordinate on the texture
int texX = (int)(wallX * (double)(texWidth));
if(side == 0 && rayDirX > 0) texX = texWidth - texX - 1;
if(side == 1 && rayDirY < 0) texX = texWidth - texX - 1;
int y;
for(y = drawStart; y < drawEnd; y++)
int d = y * 256 - h * 128 + lineHeight * 128; //256 and 128 factors to avoid floats
int texY = ((d * texHeight) / lineHeight) / 256;
int color = texture[texNum][texWidth * texY + texX];
//make color darker for y-sides: R, G and B byte each divided through two with a "shift" and an "and"
if(side == 1) color = (color >> 1) & 8355711;
buffer[x][y] = color;
}//end of for(y = drawStart; y < drawEnd; y++)
//SET THE ZBUFFER FOR THE SPRITE CASTING
ZBuffer[x] = perpWallDist; //perpendicular distance is used
//FLOOR CASTING
double floorXWall, floorYWall; //x, y position of the floor texel at the bottom of the wall
//4 different wall directions possible
if(side == 0 && rayDirX > 0)
floorXWall = mapX;
floorYWall = mapY + wallX;
}//end of if(side == 0 && rayDirX > 0)
else if(side == 0 && rayDirX < 0)
floorXWall = mapX + 1.0;
floorYWall = mapY + wallX;
}//end of else if(side == 0 && rayDirX < 0)
else if(side == 1 && rayDirY > 0)
floorXWall = mapX + wallX;
floorYWall = mapY;
}//end of else if(side == 1 && rayDirY > 0)
else
floorXWall = mapX + wallX;
floorYWall = mapY + 1.0;
}//end of else
double distWall, distPlayer, currentDist;
distWall = perpWallDist;
distPlayer = 0.0;
if (drawEnd < 0) drawEnd = h; //becomes < 0 when the integer overflows
//draw the floor from drawEnd to the bottom of the screen
for(y = drawEnd + 1; y < h; y++)
currentDist = h / (2.0 * y - h); //you could make a small lookup table for this instead
double weight = (currentDist - distPlayer) / (distWall - distPlayer);
double currentFloorX = weight * floorXWall + (1.0 - weight) * posX;
double currentFloorY = weight * floorYWall + (1.0 - weight) * posY;
int floorTexX, floorTexY;
floorTexX = (int)(currentFloorX * texWidth) % texWidth;
floorTexY = (int)(currentFloorY * texHeight) % texHeight;
//floor
buffer[x][y] = (texture[3][texWidth * floorTexY + floorTexX] >> 1) & 8355711;
//ceiling (symmetrical!)
buffer[x][h - y] = texture[6][texWidth * floorTexY + floorTexX];
}//end of for(y = drawEnd + 1; y < h; y++)
}//end of for(x = 0; x < w; x++)
//SPRITE CASTING
//sort sprites from far to close
int i;
for(i = 0; i < numSprites; i++)
spriteOrder[i] = i;
spriteDistance[i] = ((posX - sprite[i].x) * (posX - sprite[i].x) + (posY - sprite[i].y) * (posY - sprite[i].y)); //sqrt not taken, unneeded
}//end of for(i = 0; i < numSprites; i++)
combSort(spriteOrder, spriteDistance, numSprites);
//after sorting the sprites, do the projection and draw them
for(i = 0; i < numSprites; i++)
//translate sprite position to relative to camera
double spriteX = sprite[spriteOrder[i]].x - posX;
double spriteY = sprite[spriteOrder[i]].y - posY;
//transform sprite with the inverse camera matrix
// [ planeX dirX ] -1 [ dirY -dirX ]
// [ ] = 1/(planeX*dirY-dirX*planeY) * [ ]
// [ planeY dirY ] [ -planeY planeX ]
double invDet = 1.0 / (planeX * dirY - dirX * planeY); //required for correct matrix multiplication
double transformX = invDet * (dirY * spriteX - dirX * spriteY);
double transformY = invDet * (-planeY * spriteX + planeX * spriteY); //this is actually the depth inside the screen, that what Z is in 3D
int spriteScreenX = (int)((w / 2) * (1 + transformX / transformY));
//parameters for scaling and moving the sprites
#define uDiv 1
#define vDiv 1
#define vMove 0.0
int vMoveScreen = (int)(vMove / transformY);
//calculate height of the sprite on screen
int spriteHeight = abs((int)(h / (transformY))) / vDiv; //using "transformY" instead of the real distance prevents fisheye
//calculate lowest and highest pixel to fill in current stripe
int drawStartY = -spriteHeight / 2 + h / 2 + vMoveScreen;
if(drawStartY < 0) drawStartY = 0;
int drawEndY = spriteHeight / 2 + h / 2 + vMoveScreen;
if(drawEndY >= h) drawEndY = h - 1;
//calculate width of the sprite
int spriteWidth = abs( (int) (h / (transformY))) / uDiv;
int drawStartX = -spriteWidth / 2 + spriteScreenX;
if(drawStartX < 0) drawStartX = 0;
int drawEndX = spriteWidth / 2 + spriteScreenX;
if(drawEndX >= w) drawEndX = w - 1;
//loop through every vertical stripe of the sprite on screen
int stripe;
for(stripe = drawStartX; stripe < drawEndX; stripe++)
int texX = (int)(256 * (stripe - (-spriteWidth / 2 + spriteScreenX)) * texWidth / spriteWidth) / 256;
//the conditions in the if are:
//1) it's in front of camera plane so you don't see things behind you
//2) it's on the screen (left)
//3) it's on the screen (right)
//4) ZBuffer, with perpendicular distance
int y;
if(transformY > 0 && stripe > 0 && stripe < w && transformY < ZBuffer[stripe])
for(y = drawStartY; y < drawEndY; y++) //for every pixel of the current stripe
int d = (y-vMoveScreen) * 256 - h * 128 + spriteHeight * 128; //256 and 128 factors to avoid floats
int texY = ((d * texHeight) / spriteHeight) / 256;
unsigned int color = texture[sprite[spriteOrder[i]].texture][texWidth * texY + texX]; //get current color from the texture//??????????????????
if((color & 0x00FFFFFF) != 0) buffer[stripe][y] = color; //paint pixel if it isn't black, black is the invisible color
}//end of for(y = drawStartY; y < drawEndY; y++)
}//end of for(stripe = drawStartX; stripe < drawEndX; stripe++)
}//end of for(i = 0; i < numSprites; i++)
//readKeys
//move forward if no wall in front of you
if (K_UP)
if(worldMap[(int)(posX + dirX * moveSpeed)][(int)(posY)] == false) posX += dirX * moveSpeed;
if(worldMap[(int)(posX)][(int)(posY + dirY * moveSpeed)] == false) posY += dirY * moveSpeed;
}//end of if (K_UP)
//move backwards if no wall behind you
if (K_DOWN)
if(worldMap[(int)(posX - dirX * moveSpeed)][(int)(posY)] == false) posX -= dirX * moveSpeed;
if(worldMap[(int)(posX)][(int)(posY - dirY * moveSpeed)] == false) posY -= dirY * moveSpeed;
}//end of if (K_DOWN)
//rotate to the right
if (K_RIGHT)
//both camera direction and camera plane must be rotated
double oldDirX = dirX;
dirX = dirX * cos(-rotSpeed) - dirY * sin(-rotSpeed);
dirY = oldDirX * sin(-rotSpeed) + dirY * cos(-rotSpeed);
double oldPlaneX = planeX;
planeX = planeX * cos(-rotSpeed) - planeY * sin(-rotSpeed);
planeY = oldPlaneX * sin(-rotSpeed) + planeY * cos(-rotSpeed);
}//end of if (K_RIGHT)
//rotate to the left
if (K_LEFT)
//both camera direction and camera plane must be rotated
double oldDirX = dirX;
dirX = dirX * cos(rotSpeed) - dirY * sin(rotSpeed);
dirY = oldDirX * sin(rotSpeed) + dirY * cos(rotSpeed);
double oldPlaneX = planeX;
planeX = planeX * cos(rotSpeed) - planeY * sin(rotSpeed);
planeY = oldPlaneX * sin(rotSpeed) + planeY * cos(rotSpeed);
}//end of if (K_LEFT)
}//end of CastRay
//sort algorithm
void combSort(int* order, double* dist, int amount)
int gap = amount;
enum bool swapped = false;
while(gap > 1 || swapped)
//shrink factor 1.3
gap = (gap * 10) / 13;
if(gap == 9 || gap == 10) gap = 11;
if (gap < 1) gap = 1;
swapped = false;
int i;
for (i = 0; i < amount - gap; i++)
int j = i + gap;
if (dist[i] < dist[j])
double disttemp=dist[i];
dist[i]=dist[j];
dist[j]=disttemp;
int ordertemp=order[i];
order[i]=order[j];
order[j]=ordertemp;
swapped = true;
}//end of if (dist[i] < dist[j])
}//end of for (i = 0; i < amount - gap; i++)
}//end of while(gap > 1 || swapped)
}//end of combSort
the sorce file can be found here http://bruce-lab.blogspot.com/2010/04/alchemy-ray-casting-engine-source-code.htmlRadioactiveLizard, you need adobe alchemy (http://labs.adobe.com/technologies/alchemy/) to compile the C code to a swc,
not pass variables to C directly. -
Importing gif file to ImageIcon
Hi,
I am trying to use a gif file that I have included in my project (using Windows XP). I am trying to stick the image from the gif file into a ImageIcon variable, and sticking the variable into a label. Here is the code that I am using to have the program access the gif file:
private ImageIcon redX = new ImageIcon( " \\JAVA programs\\Week 8\\lab8_1a\\redshd.gif " );
I have a classPath setup in my environment variables/system variables as follows:
.;C:\Documents and Settings\Jim Roth\My Documents\Visual Studio Projects\Programs
and the path to the gif file is as follows:
C:\Documents and Settings\Jim Roth\My Documents\Visual Studio Projects\Programs\JAVA programs\Week 8\Lab8_1A\redshd.gif
When I run the program, the screen comes up empty. I am using a basic frame, with a GridLayout. When I change the input into the label to a string, it shows up on the label when the program runs.
In debug mode, I am not quite sure of what the values apply to, but oneonf them shows up as 'null'.
I think my problem lies with the program just not finding the gif.file. Any suggestions?
Thanks a lot!
JimboOK, here is the program.....it is my very first stab at anything gui. We are supposed to display a tic tac toe grid, and have it randomly put x's and o's (or something simiilar) in a3x3 grid in a random fashion. Here it is:
import javax.swing.*;
import java.awt.*;
import java.util.*;
public class TicTacToe extends JFrame
private ImageIcon redX = new ImageIcon("\\JAVA programs\\Week 8\\lab8_1a\\redshd.gif");
private ImageIcon blueCirc = new ImageIcon("\\JAVA programs\\Week 8\\lab8_1a\\qmark.gif");
/** Default constructor for TicTacToe */
public TicTacToe()
setLayout(new GridLayout(3,3,2,2));//sets grid layout for a 3x3 grid with 2 pixel spacing
//add 9 JLabels to hold image icons
for(int i =0; i < 10; ++i)
add(this.generateJLabel());
public static void main(String[] args)
TicTacToe game = new TicTacToe();
game.setTitle("Tic Tac Toe");
game.setLocationRelativeTo(null);
game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
game.setSize(250, 250);
game.setVisible(true);
protected JLabel generateJLabel()
Random rand = new Random();//instantiate random object to generate ints
int randNum = rand.nextInt(4);//generate ints between 0 and 4 (exclusive)
/*The following switch statement looks at random number generated by the Random
object and assigns an image to a JLabel according to the int returned./
switch (randNum)
case 1:
JLabel temp = new JLabel(this.redX);
return temp;
case 2:
JLabel temp1 = new JLabel(this.blueCirc);
return temp1;
default:
JLabel temp2 = new JLabel();
return temp2;
} -
How to add new increase the pool rather then trowing a error.
Im trying to build a game and after many attempts and hours of thinking i did manage to create something that looks like a game.The problem now is that there are so many objects that are constantly creating and removing from the stage. that the game is starting to slow down(it is laggy.).So i have searched the net and understood that i will have to use a "Object pooling Method" rather than creating and removing the objects after i dont have any use of them any more, if i want to make the game more memory friendly.
At first i didnt want to use this method (object pooling) ,but after a while i understood that i dont have a lot of options.So i started to search how and why and how.
Yet in this example im just trying this for the bullets (for now) cause if i can do it for them, i can manage to do it for other objects and projects (it will be simple for me to understand what is happening ., what am i doing , when do i add an existing object from the pool and when im creating a new one(when there are non left, things like this)
i did copy some part of this code from a tutorial that i found in the net but , from then i dont know how to increase the pool rather than throwing this error. I did try to create a new object or to increase the pool length but .... it is not working so im sure that im not doing something the way it must be done.
so i have this so far :
its a "simple" pool that calls a simple shape class (circle dot) and gives that to the main stage when the "SPACE" button is pressed
package
import flash.display.Sprite;
import flash.events.Event;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Shape;
public class Bullet extends Sprite{
public var rectangle:Shape = new Shape();
public function Bullet(){
super();
addEventListener(Event.ADDED_TO_STAGE, init);
graphics.beginFill(0xFF0000);
graphics.drawRect(-5, -5, 10,10);
graphics.endFill();
private function init(event:Event):void{
the SpritePool where i cant figure out how to replace the throw new error with some new code that will increase the pool
package {
import flash.display.DisplayObject;
public class SpritePool {
private var pool:Array;
private var counter:int;
public function SpritePool(type:Class, len:int) {
pool = new Array();
counter = len;
var i:int = len;
while (--i > -1) {
pool[i] = new type();
public function getSprite():DisplayObject {
if (counter > 0) {
return pool[--counter];
} else {
throw new Error("You exhausted the pool!");
public function returnSprite(s:DisplayObject):void {
pool[counter++] = s;
and the Game class (the documents class)
package {
import flash.ui.Keyboard;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Shape;
public class Game extends Sprite {
private var ship:Shape;
private var bullets:Array;
private var pool:SpritePool;
public function Game() {
Assets.init();
addEventListener(Event.ADDED_TO_STAGE, init);
private function init(event:Event):void {
pool = new SpritePool(Bullet,10);
bullets = new Array();
ship = new Shape();
ship.graphics.beginFill(0xFF00FF);
ship.graphics.drawRect(0,0, 60, 60);
ship.graphics.endFill();
ship.x = stage.stageWidth / 2 - ship.width / 2;
ship.y = stage.stageHeight - ship.height;
addChild(ship);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onDown);
addEventListener(Event.ENTER_FRAME, loop);
private function onDown(event:KeyboardEvent):void {
if (event.keyCode == Keyboard.SPACE) {
var b:Bullet = pool.getSprite() as Bullet;
b.x = ship.x + ship.width / 2;
b.y = ship.y;
addChild(b);
bullets.push(b);
trace("Bullet fired");
private function loop(event:Event):void {
for (var i:int=bullets.length-1; i>=0; i--) {
var b:Bullet = bullets[i];
b.y -= 10;
if (b.y < 0) {
bullets.splice(i, 1);
removeChild(b);
pool.returnSprite(b);
trace("Bullet disposed");
any suggestions/help how to do itTo put you on the path (the errors/events needs formalization), here would be a quick example. Your pool class:
package
import flash.display.DisplayObject;
public class SpritePool
private var pool:Array;
private var counter:int;
private var classRef:Class;
// public get to know what's left in the pool
public function get availableObjects():int
return counter;
public function SpritePool(type:Class, len:int)
classRef = type;
pool = new Array();
counter = len;
var i:int = len;
while (--i > -1)
pool[i] = new classRef();
public function getSprite():DisplayObject
if (counter > 0)
return pool[--counter];
else
throw new Error("PoolExhausted");
public function returnSprite(s:DisplayObject):void
pool[counter++] = s;
public function increasePool(amount:int):void
counter += amount;
while (--amount > -1)
pool.push(new classRef());
public function decreasePool(amount:int):void
if (counter >= amount)
counter -= amount;
pool.splice(counter - amount,amount);
else
throw new Error("PoolDecreaseFail");
Now you'd need to be catching those errors. Again, the errors should be formalized or you could use events by extending IEventDispatcher. I kept it simple.
Here would be the simple Bullet class I'm using:
package
import flash.display.Sprite;
public class Bullet extends Sprite
private var bullet:Sprite;
public function Bullet():void
var bullet:Sprite = new Sprite();
bullet.graphics.beginFill(0xFF0000,1);
bullet.graphics.drawCircle(-5,-5,10);
bullet.graphics.endFill();
addChild(bullet);
Just draws a red circle just to visualize it..
Here would be a full example of using it. It will import both of these classes (saved as SpritePool.as and Bullet.as in the same folder). Paste this in the actions panel on frame 1:
import SpritePool;
import Bullet; // a simple red 10px circle
import flash.display.Sprite;
import flash.utils.setTimeout;
// fill the pool, swim trunks optional
var pool:SpritePool = new SpritePool(Bullet, 10);
// grab some objects from the pool
// array of currently held objects
var myBullets:Array = new Array();
while (pool.availableObjects > 0)
myBullets.push(pool.getSprite());
// display in random positions
for (var i:int = 0; i < myBullets.length; i++)
addChild(myBullets[i]);
// position
myBullets[i].x = int(Math.random()*stage.stageWidth);
myBullets[i].y = int(Math.random()*stage.stageHeight);
trace("myBullets has " + myBullets.length + " bullets! pool has " + pool.availableObjects + " left.");
// now I want one more, but I should check for errors
try
// fail, none left!
myBullets.push(pool.getSprite());
catch (e:*)
// this should be a custom event, but for speed, quick and dirty
if (e == 'Error: PoolExhausted')
trace("D'oh no more bullets! I need more!");
pool.increasePool(10);
trace("Added 10 more, now available in pool " + pool.availableObjects);
// try to reduce the pool by 15, which should error
try
pool.decreasePool(15);
catch (e:*)
// again should be a formal error
if (e == 'Error: PoolDecreaseFail')
trace("Oops, can't reduce pool by 15! Let's trim all extras, available is " + pool.availableObjects);
// we know it'll work, no error checking
pool.decreasePool(pool.availableObjects);
trace("Left in pool: " + pool.availableObjects);
// now lets wait 5 seconds and remove it all back to the pool
setTimeout(ReturnToPool,5000);
function ReturnToPool():void
// now let's just return all the objects to the pool
while (myBullets.length > 0)
removeChild(myBullets[myBullets.length - 1]);
pool.returnSprite(myBullets.pop());
// now check the pool, should have 10
trace("Amount of bullets in use " + myBullets.length + ", in pool " + pool.availableObjects);
For ease you can just download my example source (saved down to CS5).
Anything from here is just symantics. For example instead of throwing an error because the pool is too small you could simply increase the pool by a fixed amount yourself and return the objects requested.
To keep objects as low as possible you could use a timer to measure the amount of objects in use over a duration and reduce the pool appropriately, knowing the pool will grow as it needs.
All of this is just to avoid unnecessary object creation.
BTW here's my trace which should match yours:
myBullets has 10 bullets! pool has 0 left.
D'oh no more bullets! I need more!
Added 10 more, now available in pool 10
Oops, can't reduce pool by 15! Let's trim all extras, available is 10
Left in pool: 0
(after 5 seconds)
Amount of bullets in use 0, in pool 10
Maybe you are looking for
-
All of a sudden, I can no longer post comments on Facebook. I get a dialogue box and type my comments. But when I hit enter, nothing happens. I opened Internet Explorer and the feature works properly. I have, in the past, been able to post on Firefox
-
Importing jar files in Sun Java Studio
Hi I am new to java and have recently installed Sun Java Studio Enterprise. As a part of assignment, I have been provided a jar file and use it. But i have not been able to load it into my program. How do i load it ?
-
CRM Pricing procedure for warranties
Hello Experts CRM 5.0 In CRM 5.0, I am evaluating implementing service plus sales orders with warranties covering some of the service items. Currently we have pricing procedure created in ECC and replicated into CRM. If I want CRM to determine warran
-
PiCked up a virus/malware please help me get rid of it. While browsing with Safari got pop up saying I won a prize. Click OK to find out what I won. Did not click Ok, but cannot close Safari without using forced shutdown. Powering down computer and r
-
SB Platinum Live 5.1 and
I have a Compaq S500NX running Windows XP SP2 and now also have a Creative Soundblaster Platinum Li've 5. audio card and li've dri've. The Installation and Application CDs say they are incompatible with my operation system (Windows XP SP2) although w