Need ideas for alternative to JavaScript for comparing two inputText values

Hello
I am currently using the JavaScript method to check if the values of two inputText components are equal.
If the values are not equal an alert box is displayed. In either case the action on the bean is performed and in the action method the two bean property values are compared again, if they don't match the action returns null and the for is redisplayed.
I don't like this method because:
A) it seems long winded and wasteful
B) the JavaScript dialog box is out of character with the rest of the form, where validation errors are returned as messages next to the offending component.
On one of the inputText components I already do a custom validation to check that the input value is a valid javax.mail.internet.InternetAddress.
Does anyone know of any other method ideas, perhaps using Value Change Events that will allow a message to be written against the second inputText component if the two values did not match, and which could be done before the Invoke Application event. I have tried something along these lines but have failed.
Many thanks in advance...

If you can use a custom tag for the validator instead of the standard f:validator tag,
there is a better way:
The custom tag has an attribute , eg. "forId", to specify the ID of another component.
Then, your validator can use the attribute for the parameter of findComponent().
Something like:
YourValidatorTagHandler.java
     protected Validator createValidator() throws JspException {
          YourValidator val = (YourValidator)super.createValidator();
          val.setForId(forId);
          return val;
YourValidator.java
     public void setForId(String f) {
          forId = f;
     public void validate(
          FacesContext context,
          UIComponent component,
          Object value)
          throws ValidatorException {
               int i1;
               int i2;
               try {
                    i1 = ((Integer) value).intValue();
                    UIComponent comp = component.findComponent(forId);
                    String val = (String)((UIInput)comp).getSubmittedValue();
                    i2 = Integer.parseInt(val);
               } catch (RuntimeException e) {
                    FacesMessage msg = new FacesMessage(e.getMessage());
                    throw new ValidatorException(msg);
               if (i1 != i2) {
                    FacesMessage msg = new FacesMessage("Error");
                    throw new ValidatorException(msg);
     }

Similar Messages

  • Ideas for integrate two landscape that individually has one XI system

    does anyone have the Ideas for integrate two landscape that individually has one XI system?
    our scenario is: in one customer side we have a xi as integration approach, and the other one also has one xi, we need to integrate them two landscape together
    and use one of the xi server as a central access points.
    my concern is :  is it a good idea to reach this goal ? since this is a
    task like;   app in landscape 1 ---> xi1 -
    > xi2 ---> app in landscape 2
    are there any other solutions ?
    thanks a lot !!

    Hi
    I guess its a XI-XI Scenario.You need to integrate two XI's
    For Reference
    XI to XI communication
    idoc to file scenario
    Thanks

  • Oracle SP for comparing 80 column values across 8 table pairs in 2 diff DBs

    Hi All,
    I have an Oracle SP for comparing 80 column values across 8 table pairs in 2 diff DBs.
    However, it is taking hell lot of time around 6hours to process 10,000 records.
    Can anyone suggest how to fine-tune this?
    Thanks guys.

    Tables prefixed with X are the temp tables to store data of DB-A.
    The report will be originally based on DB-B, so DB Links will not be required for @PROD1.WORLD tables.
    This is a test region, so I have pointed to @PROD1.WORLD to test with Prod Data.
    SEC_COMPARE_CONFIG is the config table containing the table_name to be reported, corresponding temp tables to store the data and the columns on which it is to be reported.
    There are in total 8 tables- 90 rows and 8 temp tables.
    SPOKE_TO_HUB_SEC_MTCH_TBL records the securities on which it is to be reported.
    HIST_DATA_COMPARE_TBL is the final results table.
    Here is the entire code:
    CREATE OR REPLACE PACKAGE SECURITY_COMPARE AS
    PROCEDURE          PROCESS_RECORDS       (IN_EFFECTIVE_DATE               IN        DATE,
                                              IN_PRIMARY_ASSET_ID            IN        VARCHAR2    DEFAULT NULL);
    PROCEDURE          IDENTIFY_SECURITIES    ( P_EFFECTIVE_DATE                IN          DATE,
                                                P_PRIMARY_ASSET_ID              IN         VARCHAR2  DEFAULT NULL);
    PROCEDURE           RETREIVE_RECORDS_FROM_SPOKE;
    PROCEDURE           COMPARE_RECORDS(p_err_msg     OUT     VARCHAR2);
    PROCEDURE           INSERT_DATA_TO_TABLE  ( v_target_table VARCHAR2,  v_sql_to_run   VARCHAR2,    v_commit_after NUMBER);
    END SECURITY_COMPARE;
    CREATE OR REPLACE PACKAGE BODY SECURITY_COMPARE AS
    /*Declared String for recording Dynamic SQL's*/
    LC_SQL                  VARCHAR2 (20000);
    PROCEDURE   PROCESS_RECORDS(IN_EFFECTIVE_DATE              IN  DATE,
                                IN_PRIMARY_ASSET_ID          IN  VARCHAR2    DEFAULT NULL)
    AS
    L_EFF_DATE                                        DATE;                      
    L_PRIMARY_ASSET_ID                         VARCHAR2(100);                    
    k_err_msg                                           VARCHAR2(100);                    --Error message displayed in case of NO discretionary records found.
    BEGIN
                    L_EFF_DATE                    := IN_EFFECTIVE_DATE;
                    L_PRIMARY_ASSET_ID     := IN_PRIMARY_ASSET_ID;
                    IDENTIFY_SECURITIES(L_EFF_DATE,L_PRIMARY_ASSET_ID);        --Calling the Identify_Securities procedure to identify the securities older by 90 days from report effective date
                    RETREIVE_RECORDS_FROM_SPOKE();                                        --Retreiving the historic records from the security tables into temporary tables.
                    COMPARE_RECORDS(p_err_msg=>k_err_msg);                          --Compare the records and report the discrepencies into HIST_DATA_COMPARE_TBL table      
    END PROCESS_RECORDS;
    PROCEDURE IDENTIFY_SECURITIES(P_EFFECTIVE_DATE              IN  DATE,
                                                        P_PRIMARY_ASSET_ID               IN  VARCHAR2  DEFAULT NULL)
    AS
    P_EFF_DATE                          DATE;                       --Effective Date of the report
    P_PRIMARY_ID                         VARCHAR2(100);     --Primary AssetID which is used to search based on specific security
    v_target_table                        VARCHAR2(500);     --Variable indicating the Target table for inserting the data
    v_sql_to_run                          VARCHAR2(5000);   --Variable to store the Dynamic SQL to be executed
    v_commit_after                      NUMBER;                --Variable to define after how many records is COMMIT to be done
    BEGIN
            LC_SQL                 :='';
            P_EFF_DATE          := P_EFFECTIVE_DATE;
            P_PRIMARY_ID         := P_PRIMARY_ASSET_ID;
            /*Deleting Old Entries from SPOKE_TO_HUB_SEC_MTCH_TBL table*/
               LC_SQL := 'TRUNCATE TABLE SPOKE_TO_HUB_SEC_MTCH_TBL';
               EXECUTE IMMEDIATE LC_SQL;
            IF(P_PRIMARY_ID is NULL)    --In case records do not need to be identified on basis of specific security
            THEN  
                /*Identify Securities older by 90days from report effective date*/
                     v_target_table := ' SPOKE_TO_HUB_SEC_MTCH_TBL';
                     v_sql_to_run := 'WITH T AS ('||
                                             ' SELECT  R.PRIMARY_ASSET_ID PRIMARY_ASSET_ID_R,'||
                                             ' R.SECURITY_ALIAS SECURITY_ALIAS_R,'||
                                             ' R.LAST_HELD_DATE LAST_HELD_DATE_R,'||
                                             ' R.PREV_HELD_DATE PREV_HELD_DATE_R,'||
                                             ' Q.PRIMARY_ASSET_ID PRIMARY_ASSET_ID_Q,'||
                                             ' Q.SECURITY_ALIAS SECURITY_ALIAS_Q,'||
                                             ' COUNT(*) OVER(PARTITION BY Q.PRIMARY_ASSET_ID) CNT'||
                                            ' FROM  [email protected] R,'||
                                            ' [email protected] Q'||
                                            ' WHERE SYS_OP_MAP_NONNULL(R.last_held_date) <> '||q'!'FF'!'||
                                           ' and ceil(R.last_held_date-to_date('||''''||P_EFF_DATE||''''||')) >= 0'||
                                           ' and ceil(R.last_held_date-to_date('||''''||P_EFF_DATE||''''||')) <= 60'||
                                           ' and R.PRIMARY_ASSET_ID=Q.PRIMARY_ASSET_ID'||
                                           ' )'||
                                          ' SELECT  PRIMARY_ASSET_ID_R,'||
                                          ' SECURITY_ALIAS_R,'||
                                          ' LAST_HELD_DATE_R,'||
                                          ' PREV_HELD_DATE_R,'||
                                          ' PRIMARY_ASSET_ID_Q,'||
                                          ' SECURITY_ALIAS_Q'||
                                          ' FROM  T'||
                                          ' WHERE CNT =1';
                     v_commit_after := 0;
                     INSERT_DATA_TO_TABLE(v_target_table,v_sql_to_run,v_commit_after);
            ELSE
                        v_target_table := ' SPOKE_TO_HUB_SEC_MTCH_TBL';
                        v_sql_to_run := 'WITH T AS ('||
                                             ' SELECT  R.PRIMARY_ASSET_ID PRIMARY_ASSET_ID_R,'||
                                             ' R.SECURITY_ALIAS SECURITY_ALIAS_R,'||
                                             ' R.LAST_HELD_DATE LAST_HELD_DATE_R,'||
                                             ' R.PREV_HELD_DATE PREV_HELD_DATE_R,'||
                                             ' Q.PRIMARY_ASSET_ID PRIMARY_ASSET_ID_Q,'||
                                             ' Q.SECURITY_ALIAS SECURITY_ALIAS_Q,'||
                                             ' COUNT(*) OVER(PARTITION BY Q.PRIMARY_ASSET_ID) CNT'||
                                            ' FROM  [email protected] R,'||
                                            ' [email protected] Q'||
                                            ' where R.PRIMARY_ASSET_ID='||''''||P_PRIMARY_ID||''''||
                                            ' and R.PRIMARY_ASSET_ID=Q.PRIMARY_ASSET_ID'||
                                           ' )'||
                                          ' SELECT  PRIMARY_ASSET_ID_R,'||
                                          ' SECURITY_ALIAS_R,'||
                                          ' LAST_HELD_DATE_R,'||
                                          ' PREV_HELD_DATE_R,'||
                                          ' PRIMARY_ASSET_ID_Q,'||
                                          ' SECURITY_ALIAS_Q'||
                                          ' FROM  T'||
                                          ' WHERE CNT =1';
                           v_commit_after := 0;
                           INSERT_DATA_TO_TABLE(v_target_table,v_sql_to_run,v_commit_after);
            END IF;
            LC_SQL := 'TRUNCATE TABLE HIST_DATA_COMPARE_TBL';
            EXECUTE IMMEDIATE LC_SQL;
    END IDENTIFY_SECURITIES;
    PROCEDURE           RETREIVE_RECORDS_FROM_SPOKE
    AS
    v_target_table                                                      VARCHAR2(500);
    v_sql_to_run                                                        VARCHAR2(5000);
    v_commit_after                                                      NUMBER;
    BEGIN
        LC_SQL :='';
        LC_SQL:= 'TRUNCATE TABLE X_SECMASTER_HISTORY_TBL';
        EXECUTE IMMEDIATE LC_SQL;
        LC_SQL:= 'TRUNCATE TABLE X_SEC_MASTER_DTL_HIST_TBL';
        EXECUTE IMMEDIATE LC_SQL;
        LC_SQL:= 'TRUNCATE TABLE X_SECMASTER_DTL_EXT_HST_TBL';
        EXECUTE IMMEDIATE LC_SQL;
        LC_SQL:= 'TRUNCATE TABLE X_EQUITY_HIST_TBL';
        EXECUTE IMMEDIATE LC_SQL;
        LC_SQL:= 'TRUNCATE TABLE X_EQUITY_DETAIL_HIST_TBL';
        EXECUTE IMMEDIATE LC_SQL;
        LC_SQL:= 'TRUNCATE TABLE X_FIXED_INCOME_HIST_TBL';
        EXECUTE IMMEDIATE LC_SQL;
        LC_SQL:= 'TRUNCATE TABLE X_FIXED_INCOME_DTL_EXT_TBL';
        EXECUTE IMMEDIATE LC_SQL;
        LC_SQL:= 'TRUNCATE TABLE X_DERIVATIVES_HIST_TBL';
        EXECUTE IMMEDIATE LC_SQL;
            /*SECMASTER_HISTORY*/
            v_target_table := 'X_SECMASTER_HISTORY_TBL';
            v_sql_to_run := ' SELECT /*+DRIVING_SITE(K)*/ K.* FROM [email protected] K '||
                                    ' INNER JOIN SPOKE_TO_HUB_SEC_MTCH_TBL I'||
                                    ' ON K.SECURITY_ALIAS = I.SPOKE_SEC'||
                                    ' AND K.SRC_INTFC_INST = 140 '||
                                    ' and K.EFFECTIVE_DATE =(SELECT /*+DRIVING_SITE(H)*/ MAX (H.EFFECTIVE_DATE) FROM  [email protected] H WHERE'||
                                    ' H.SECURITY_ALIAS = K.SECURITY_ALIAS AND H.SRC_INTFC_INST = K.SRC_INTFC_INST)' ;
                           v_commit_after := 0;
                           INSERT_DATA_TO_TABLE(v_target_table,v_sql_to_run,v_commit_after);
        /*SECURITY_MASTER_DETAIL_HIST*/
                v_target_table := 'X_SEC_MASTER_DTL_HIST_TBL';
              v_sql_to_run:=       ' SELECT /*+DRIVING_SITE(K)*/ K.* FROM [email protected] K '||
                     ' INNER JOIN SPOKE_TO_HUB_SEC_MTCH_TBL I'||
                     ' ON K.SECURITY_ALIAS = I.SPOKE_SEC'||
                     ' AND K.SRC_INTFC_INST = 140 '||
                     ' and K.EFFECTIVE_DATE =(SELECT /*+DRIVING_SITE(H)*/ MAX (H.EFFECTIVE_DATE) FROM [email protected] H WHERE'||
                     ' H.SECURITY_ALIAS = K.SECURITY_ALIAS AND H.SRC_INTFC_INST = K.SRC_INTFC_INST)' ;
                           v_commit_after := 0;
                           INSERT_DATA_TO_TABLE(v_target_table,v_sql_to_run,v_commit_after);
        /*SECMASTER_DETAIL_EXT_HIST*/
        v_target_table := 'X_SECMASTER_DTL_EXT_HST_TBL';
               v_sql_to_run:=       ' SELECT /*+DRIVING_SITE(K)*/ K.* FROM [email protected] K '||
                     ' INNER JOIN SPOKE_TO_HUB_SEC_MTCH_TBL I'||
                     ' ON K.SECURITY_ALIAS = I.SPOKE_SEC'||
                      ' AND K.SRC_INTFC_INST = 140 '||
                      ' and K.EFFECTIVE_DATE =(SELECT /*+DRIVING_SITE(H)*/ MAX (H.EFFECTIVE_DATE) FROM [email protected] H WHERE'||
                      ' H.SECURITY_ALIAS = K.SECURITY_ALIAS AND H.SRC_INTFC_INST = K.SRC_INTFC_INST)' ;
                           v_commit_after := 0;
                           INSERT_DATA_TO_TABLE(v_target_table,v_sql_to_run,v_commit_after);
        /*EQUITY_HIST*/
        v_target_table := 'X_EQUITY_HIST_TBL';
               v_sql_to_run:=        ' SELECT /*+DRIVING_SITE(K)*/ K.* FROM [email protected] K '||
                      ' INNER JOIN SPOKE_TO_HUB_SEC_MTCH_TBL I'||
                      ' ON K.SECURITY_ALIAS = I.SPOKE_SEC'||
                       ' AND K.SRC_INTFC_INST = 140 '||
                       ' and K.EFFECTIVE_DATE =(SELECT /*+DRIVING_SITE(H)*/ MAX (H.EFFECTIVE_DATE) FROM [email protected] H WHERE'||
                       ' H.SECURITY_ALIAS = K.SECURITY_ALIAS AND H.SRC_INTFC_INST = K.SRC_INTFC_INST)' ;
                           v_commit_after := 0;
                           INSERT_DATA_TO_TABLE(v_target_table,v_sql_to_run,v_commit_after);
        /*EQUITY_DETAIL_HIST*/
        v_target_table := 'X_EQUITY_DETAIL_HIST_TBL';
             v_sql_to_run:=        ' SELECT /*+DRIVING_SITE(K)*/ K.* FROM [email protected] K '||
                     ' INNER JOIN SPOKE_TO_HUB_SEC_MTCH_TBL I'||
                     ' ON K.SECURITY_ALIAS = I.SPOKE_SEC'||
                     ' AND K.SRC_INTFC_INST = 140 '||
                     ' and K.EFFECTIVE_DATE =(SELECT /*+DRIVING_SITE(H)*/ MAX (H.EFFECTIVE_DATE) FROM [email protected] H WHERE'||
                     ' H.SECURITY_ALIAS = K.SECURITY_ALIAS AND H.SRC_INTFC_INST = K.SRC_INTFC_INST)' ;
                           v_commit_after := 0;
                           INSERT_DATA_TO_TABLE(v_target_table,v_sql_to_run,v_commit_after);
        /*FIXED_INCOME_HIST*/
            v_target_table := 'X_FIXED_INCOME_HIST_TBL';
               v_sql_to_run:=       ' SELECT /*+DRIVING_SITE(K)*/ K.* FROM [email protected] K '||
                     ' INNER JOIN SPOKE_TO_HUB_SEC_MTCH_TBL I'||
                     ' ON K.SECURITY_ALIAS = I.SPOKE_SEC'||
                      ' AND K.SRC_INTFC_INST = 140 '||
                      ' and K.EFFECTIVE_DATE =(SELECT /*+DRIVING_SITE(H)*/ MAX (H.EFFECTIVE_DATE) FROM [email protected] H WHERE'||
                      ' H.SECURITY_ALIAS = K.SECURITY_ALIAS AND H.SRC_INTFC_INST = K.SRC_INTFC_INST)' ;
                           v_commit_after := 0;
                           INSERT_DATA_TO_TABLE(v_target_table,v_sql_to_run,v_commit_after);
        /*FIXED_INCOME_DETAIL_EXT_HIST*/
        v_target_table := 'X_FIXED_INCOME_DTL_EXT_TBL';
               v_sql_to_run:=       ' SELECT /*+DRIVING_SITE(K)*/ K.* FROM [email protected] K '||
                     ' INNER JOIN SPOKE_TO_HUB_SEC_MTCH_TBL I'||
                     ' ON K.SECURITY_ALIAS = I.SPOKE_SEC'||
                      ' AND K.SRC_INTFC_INST = 140 '||
                      ' and K.EFFECTIVE_DATE =(SELECT /*+DRIVING_SITE(H)*/ MAX (H.EFFECTIVE_DATE) FROM [email protected] H WHERE'||
                      ' H.SECURITY_ALIAS = K.SECURITY_ALIAS AND H.SRC_INTFC_INST = K.SRC_INTFC_INST)' ;
                           v_commit_after := 0;
                           INSERT_DATA_TO_TABLE(v_target_table,v_sql_to_run,v_commit_after);
        /*DERIVATIVES_HIST*/
        v_target_table := 'X_DERIVATIVES_HIST_TBL';
           v_sql_to_run:=           ' SELECT /*+DRIVING_SITE(K)*/ K.* FROM [email protected] K '||
                      ' INNER JOIN SPOKE_TO_HUB_SEC_MTCH_TBL I'||
                     ' ON K.SECURITY_ALIAS = I.SPOKE_SEC'||
                      ' AND K.SRC_INTFC_INST = 140 '||
                      ' and K.EFFECTIVE_DATE =(SELECT /*+DRIVING_SITE(H)*/ MAX (H.EFFECTIVE_DATE) FROM [email protected] H WHERE'||
                      ' H.SECURITY_ALIAS = K.SECURITY_ALIAS AND H.SRC_INTFC_INST = K.SRC_INTFC_INST)' ;
                           v_commit_after := 0;
                           INSERT_DATA_TO_TABLE(v_target_table,v_sql_to_run,v_commit_after);
    END RETREIVE_RECORDS_FROM_SPOKE;
    PROCEDURE           COMPARE_RECORDS(p_err_msg     OUT     VARCHAR2)
    AS
        l_count                                                                 NUMBER;
        l_err_msg                                                             VARCHAR2(100);
        TYPE T_SECURITIES is TABLE of HIST_DATA_COMPARE_TBL%rowtype;
        ttype                                                                    T_SECURITIES;
        CURSOR C1
        IS
        SELECT  TABLE_NAME, TEMP_TABLE, COLUMN_NAME from SEC_COMPARE_CONFIG
        where column_name='EFFECTIVE_DATE';
        CURSOR C2
        IS
        SELECT * FROM SEC_COMPARE_CONFIG where id <=82;
        C_REC                                 SEC_COMPARE_CONFIG%rowtype;
        BEGIN
            LC_SQL :='';
            p_err_msg :='';
                FOR C_REC in C1
                loop  
                                LC_SQL:=     ' SELECT /*+DRIVING_SITE(B)*/ /*+PARALLEL(A,100)*/ B.SECURITY_ALIAS, to_char(C.SPOKE_PAID), A.SECURITY_ALIAS,to_char(C.HUB_PAID),'||''''||C_REC.TABLE_NAME||''''||','||q'!'EFFECTIVE_DATE'!'||','||
                                                    ' NVL((cast(B.'||C_REC.COLUMN_NAME||' as VARCHAR2(100))),'||q'!'No Records Found'!'||'),'||
                                                    ' NVL((cast(A.'||C_REC.COLUMN_NAME||' as VARCHAR2(100))),'||q'!'No Records Found'!'||')'||
                                                    ' FROM '||C_REC.TEMP_TABLE||' A, SECURITYDBO.'||C_REC.TABLE_NAME ||'@PROD1.WORLD B,'||
                                                    ' SPOKE_TO_HUB_SEC_MTCH_TBL C'||                                
                                                    ' WHERE A.SRC_INTFC_INST=140'||
                                                    ' AND B.SRC_INTFC_INST=140'||
                                                    ' AND A.SECURITY_ALIAS=C.spoke_sec'||
                                                    ' and b.security_alias=C.HUB_SEC'||
                                                    ' AND a.effective_date <> (select max(h.effective_date) from SECURITYDBO.'||C_REC.TABLE_NAME||'@PROD1.WORLD H'||
                                                    ' where h.security_alias=c.hub_sec and h.src_intfc_inst=140 )';
                                        EXECUTE IMMEDIATE LC_SQL BULK COLLECT into ttype;
                              FORALL x in ttype.First..ttype.Last
                                        insert into HIST_DATA_COMPARE_TBL values ttype(x);                 
                                        commit;
                end loop;
               For C_REC in C2
                loop
                                LC_SQL:=     ' SELECT /*+DRIVING_SITE(B)*/ /*+PARALLEL(A,100)*/ B.SECURITY_ALIAS, to_char(C.SPOKE_PAID), A.SECURITY_ALIAS,to_char(C.HUB_PAID),'||''''||C_REC.TABLE_NAME||''''||','||''''||C_REC.COLUMN_NAME||''''||','||
                                                    ' NVL((cast(B.'||C_REC.COLUMN_NAME||' as VARCHAR2(100))),'||q'!'No Records Found'!'||'),'||
                                                    ' NVL((cast(A.'||C_REC.COLUMN_NAME||' as VARCHAR2(100))),'||q'!'No Records Found'!'||')'||
                                                    ' FROM '||C_REC.TEMP_TABLE||' A, SECURITYDBO.'||C_REC.TABLE_NAME ||'@PROD1.WORLD B,'||
                                                    ' SPOKE_TO_HUB_SEC_MTCH_TBL C'||                                
                                                    ' WHERE A.SRC_INTFC_INST=140'||
                                                    ' AND B.SRC_INTFC_INST=140'||
                                                    ' AND A.SECURITY_ALIAS=C.spoke_sec'||
                                                    ' and b.security_alias=C.HUB_SEC'||
                                                    ' and b.effective_date=a.effective_date'||
                                                  ' AND NVL((cast(A.'||C_REC.column_name||' as VARCHAR2(100))),'||q'!'No Records Found'!'||') <>'||
                                                    ' NVL((cast(B.'||C_REC.column_name||' as VARCHAR2(100))),'||q'!'No Records Found'!'||')';
                             EXECUTE IMMEDIATE LC_SQL BULK COLLECT into ttype;
                            FORALL x in ttype.First..ttype.Last
                                    insert into HIST_DATA_COMPARE_TBL values ttype(x);                 
                                    commit;
                end loop;
                BEGIN
                    select  count(*) into l_count from HIST_DATA_COMPARE_TBL;
                    if(l_count=0) then
                            l_err_msg :='No records found';
                    end if;
                END;
        END COMPARE_RECORDS;
                NAME:               INSERT_DATA_TO_TABLE
    DESCRIPTION:               This procedure will insert the records into the target table based based on the data fetched using the sql to run variable.
                                        It also records the commit_after variable which defines that after how many records the insert needs to be committed.
    PROCEDURE INSERT_DATA_TO_TABLE  ( v_target_table VARCHAR2,
                                                                v_sql_to_run   VARCHAR2,
                                                                v_commit_after NUMBER) IS
    v_limit_sql1    VARCHAR2(300) := ' ';
    v_limit_sql2    VARCHAR2(900) := ' ';
    v_plsql_to_run  VARCHAR2(32767);
    BEGIN
            IF NVL(v_commit_after,0) <> 0 THEN
                v_limit_sql1:=  '  LIMIT ' || TO_CHAR(v_commit_after) ;
                v_limit_sql2:=  '   IF MOD(v_number_of_rows, ' || TO_CHAR(v_commit_after) || ' ) = 0 THEN     ' ||
                      '       COMMIT;                                                               ' ||
                      '   END IF;                                                                   ' ;
            END IF;
            v_plsql_to_run:=  '                                                                             ' ||
                      'DECLARE                                                                      ' ||
                      ' v_number_of_rows number:=0;                                                 ' ||
                      '                                                                             ' ||
                      ' TYPE MyType IS REF CURSOR;                                                  ' ||
                      ' CV MyType;                                                                  ' ||
                      ' TYPE RecTyp IS TABLE OF ' || v_target_table || '%ROWTYPE;                   ' ||
                      ' rec RecTyp;                                                                 ' ||
                      '                                                                             ' ||
                      'BEGIN                                                                        ' ||
                      '                                                                             ' ||
                      'OPEN CV FOR                                                                  ' ||
                      '    ' || REPLACE( v_sql_to_run, ';', ' ' )  || ' ;                           ' ||
                      ' LOOP                                                                        ' ||
                      '     FETCH CV BULK COLLECT INTO rec ' || v_limit_sql1 || ';                  ' ||
                      '     FORALL i IN 1..rec.COUNT                                                ' ||
                      '         INSERT /*+ APPEND */ INTO ' || v_target_table || ' VALUES rec(i);   ' ||
                      '         v_number_of_rows  := v_number_of_rows + SQL%ROWCOUNT;               ' ||
                      ' ' || v_limit_sql2 || '                                                      ' ||
                      '     EXIT WHEN CV%NOTFOUND;                                                  ' ||
                      '                                                                             ' ||
                      ' END LOOP;                                                                   ' ||
                      ' COMMIT;                                                                     ' ||
                      ' CLOSE CV;                                                                   ' ||
                      'END;                                                                         ';
            EXECUTE IMMEDIATE v_plsql_to_run;
            COMMIT;
    END INSERT_DATA_TO_TABLE;
    END SECURITY_COMPARE;

  • Compare two dropdownlists values with each other!!!!!!

    Hi ,
    I have two dropdown s with some values i want to compare two dropdowns values. I have java script on the click event of the button it will compare values of drodpowns. If any redundant/duplicate value found then those values need to be deleted from the second dropdown.
    function dummy()
    var dd1=xfa.resolveNode(form1.Page1.State.somExpression);       //path to first dropdown
    var dd2 = xfa.resolveNode(form1.Page1.Dummy.somExpression);  //path to second dropdown
    var i =0;
    var j=0;
    if(State.length!= 0)//State is first dropdown
         for (;i<dd1.length;i++)
              for(;j<dd2.length;j++)
                   if(dd1.getDisplayItem(i)==dd2.getDisplayItem(j))
                       dd2.deleteItem(j);   //deleting the value from second dropdown.
                        break;
                   else
                        continue;
    But this function is not working properly it is taking first value of the DD1 and comapring with all the values of DD2 and coming out of the loop .There are other values in the DD1.So for that comapring is not happening.
    Please help me !!!
    Thanks in advance,
    Bharathi.

    Hi,
    You just need to re-initialise the j variable each time though the i loop.  As you have it the second time around j will already be equal to dd2.length so will skip the inner loop.
    try
    for(var j=0;j<dd2.length;j++)
    Regards
    Bruce

  • Need Ideas for Minimalist Website and Image Gallery

    I am looking for ideas for creating a minimalist online image gallery/portfolio? I want to either use html for the site and then flash for the portfolio images or some other method. I want to click on the thumbnails and then a large image will open.
    Should I use Flash, Dreamweaver, Would it be easier to load the images dynamically to a folder. Does anyone have an example they could show me. Thanks.

    I second Mahendra's suggestion for JAlbum Excellent product!  Just so you know, you don't need to use their image hosting.  Simply download the software and install it on your PC.   The beauty of JAlbum is that it generates thumbnails and HTML pages for you from your folder of images.  Lots of different Skins available. CSS can be customized.  And you can't beat the price. 
    Minimalism is nice but on the web, if you don't have some real text in the HTML markup you're essentially invisible to search engines, language translators and web assisting technologies like screen readers.  I realize this is a portfolio, but you want to maintain some degree of visibility so people can find you.  For this reason, Flash sites don't do well.  HTML is preferred.
    Good luck with your project,
    Nancy O.
    Alt-Web Design & Publishing
    Web | Graphics | Print | Media  Specialists
    http://alt-web.com/
    http://twitter.com/altweb

  • Any diff-like tools for comparing two .vcf (vcard) files?

    Hi all,
    I'm used to keeping contact information backups in .csv form, its just much simpler to parse with sed/awk etc., I have a small home-cooked script to move fields around between Evolution .csv files and JPilot .csv files such that they match (brittle, but worked for me).
    Current Evolution doesn't seem to support csv output anymore, though, and to be honest the brittle-ness of having to hard-code in my scripts which column in the csv was what data always stung a bit. Evolution DOES output vcards, as does J-Pilot. Unfortunately, parsing vcards with sed/awk and the like promises to be real headache-inducing.
    Basically, has anyone heard of tools for comparing .vcf files? Sort of like diff (which works line-by-line on text) but working element by element on .vcf files.

    Daenyth wrote:
    http://search.cpan.org/dist/Text-vCard/ … essbook.pm
    Write one?
    Was afraid the answer was gonna be that.

  • Tool for comparing two schemas....

    Do we have any tool avalilable in oracle that compares two different schemas and find out the differences between two so that we can validate a schema against a standard one?

    Hi.
    Toad have option that is called just like that , compare schemas, and when used to compare two schemas it outputs diferences between them.
    I dont know about any other tool.

  • Compare Two Input value

    Hi All,
    I have two inputText box in JSF page one is for minValue and other is for maxValue. My problem is like this:
    If i fill 20 in minValue box than maxValue should be >= to minValue. If not then an error message should be display on JSF page, after insertion of value in maxValue box.
    Please suggest me, what options are avaiable in JSF to solve this kind of comparision. Please explain with example(s).

    Likely you misunderstood the valueChangeListener / ValueChangeEvent.
    To issue a ValueChangeEvent which will be used by valueChangeListener the client still have to submit the form to the server. Generally you see this back in selectboxes using the Javascript submit() function in the onchange attribute. Yes, that one is really a Javascript function. But this is only intented submit the form automatically on change of the value so that the client does not need to press the submit button. Finally, once the request is arrived into the server, the ValueChangeEvent will be created and fired. And that is certainly not clientside.
    You may find this article interesting to get more insights in the JSF lifecycle:
    http://balusc.xs4all.nl/srv/dev-jep-djl.html

  • Need ideas for plug-in re-design

    My DAQ app uses "Plugins".   A Plugin is a VI which conforms to a particular terminal configuration.
    Here is the complete diagram of a simple one:
    The idea is that a plugin is another channel: This one takes the value of TORQUE (in N-m) and the value of SPEED (in RPM), performs some computation, and produces a result POWER (in kW).
    The user can then think of this as just another channel - it shows up in the datastream and the user can plot it, record it, set alarms on it, convert it to an output and send it out the CAN bus, anything he can do with a real channel, he can do with this plugin channel.
    So the above is exactly equivalent to having a POWER transducer.
    They can get much more complex than this.
    My code organizes these so that the prerequisite channels are run first, and then the dependent ones. (a prerequisite channel could also be a plug-in).
    If plugin B depends on plugin A as a prerequisite, I make sure that A runs first, regardless of which comes first in the CONFIG file.
    So the actual DAQ code samples the hardware channels, and then the plugins in a particular order.
    The DAQ is sampling at 10 Hz, and so these plugins run at that rate too.  There may be 100 different plugins, maybe 50 at a time in one test.
    The DAQ runs on a PXI box, running RTOS.  The host is an ordinary PC, running Windows.
    Even though the PXI is running a compiled RTEXE, it still loads the source-code VIs and runs them.
    My data file includes all the recorded data, all the config stuff used to set that up, AND THE PLUGIN VIs THEMSELVES.
    The plugin VI files are read as strings and stored in the datafile as strings, along with their names.
    When reading a data file, I read this string, and store it in a "sandbox" folder with a .VI extension.
    This guarantees that the version I have is the version the data was originally recorded with.
    The user can EDIT the data files, for example changing the scale factor on the SPEED channel from 307.3 RPM/V to 308.5 RPM/V.
    That causes a re-calculation of the SPEED channel.
    It ALSO causes a re-calculation of the POWER channel: My code detects that POWER depends on SPEED and since SPEED changed, I have to run every sample back through the POWER VI to get a new value. (Remember they're not all as simple as this example).
    THAT is why the VIs are stored in the data file.
    ALL OF THAT WORKS. 
    100%
    Like a dream.
    For 8-9 years now.
    EXCEPT...
    When it comes time to change LABVIEW versions.
    MY client has 10,000+ data files, each with 5-50 VIs embedded. Files are spread among 30+ machines, with a central server backup.
    We need to hang on to this data.
    I have a File Updater, which will take datafiles and update them (they are a DataLog file).
    THE TROUBLE IS:
    If I take a recent datafile, recorded with LV2010 (where we've been for 3+ years) and open it with the EXE built with LV2013, there's a problem if it tries to reprocess it.  The  error comes out as 
    Error Code 1126 occurred at Open VI Reference in HDT Open PlugIn.vi->HDT Find Calc Prerequisites.vi->HDT DataFile Prerequisite Manager.vi->HDT DataFile Viewer.vi->HDT.vi<APPEND>
    An error occurred loading VI 'BSFC.vi'.
    LabVIEW load error code 10: VI version (10.0) is too old to convert to the current LabVIEW version (13.0).
    The EXE code, having no COMPILER handy, cannot use the old VI.
    My FILE UPDATER, has a recompiler built into it (it reads the VI string, saves it as a VI file, opens it as a VI, saves it as a VI, then reads it as a string and puts it back where it belongs. 
    But if THAT is built into an EXE, it doesn't work either. Same problem, same error.
    If I run the FILE UPDATER from the LV2013 DevSys, then it's OK.  The re-compile process works fine, and then the EXE can read it and use the VI.
    BUT:
    1... That's painfully slow.  I have a cache handler where I recompile each VI only once and recognize it if I see it again, but still it's a long process.
    2... That doesn't work from an EXE.  My client has 2-3 DevSystems and 30+ computers with just the EXE. But that's where the data files are.
    3... Backup up Data Files on CD or DVD doesn't work.
    SO............  TO make a long story even longer.......
    I'm looking for an alternative.
    REQUIREMENTS:
    1... String-based, I suppose.  I want to type in "Power = Torque * Speed / 9545" and have the code know to fetch the value of  "Power", the value of "Torque", do the math, and produce the result.
    2... Has to execute quickly.  I have a zillion things to do at 10 Hz.
    3... Has to be able to re-order itself.  If I have ANOTHER plug-in channel called Fuel per Watt, and it calculates "FuelPerWatt = FuelFlow / Power * 10.34", then it has to know to execute POWER before it executes FUELPERWATT.
    4... Musr work from an EXE and an RTEXE.
    I've looked at a thing called MathToG, and it works OK for creating a VI from an equation, but it needs VI scripting, and therefore won't work from an EXE
    Any ideas?
    Steve Bird
    Culverson Software - Elegant software that is a pleasure to use.
    Culverson.com
    Blog for (mostly LabVIEW) programmers: Tips And Tricks

    Starting at the top, create a class which has no data and two methods - GetPrerequisites and Execute.  Both are dynamic dispatch (use the right-click option in the New menu in the project to create them).
    GetPrerequisites - has the input and output of the parent class so it is dynamic dispatch, and has a single output which is an array of the same class.  You may want error I/O as well.
    Execute - has the input and output of the parent class so it is dynamic dispatch, and has Result and Units outputs.  The prerequisites output is redundant with the previous function, but can be added.  Again, you may want error I/O.
    In the parent class, both of these functions are essentially empty and return default data.  The parent class is used for a template and to provide a parent for the function classes.  As such, set the properties for each of the methods so that children must override them (do this in the class properties dialog box).  Set these up the way you want them up front, since the children must use the exact same connector pane.
    The functions themselves are all created as follows:
    Create a class
    Change its inheritance so it inherits from the parent class - it is now a child
    Use the new menu on the child class to create functions to override the originals
    Delete all code but the terminals in the child functions
    Change the GetPrerequisites code so it returns a constant array of the prerequisite objects.  These will be parallel children of the original parent class.  For your power class, this would be an array containing the torque and speed classes.  The easiest way to create this array is to drag a copy of the torque and speed classes onto the block diagram and use build array.  They will be "coerced" to the parent class, but LabVIEW still knows what they are.
    Change the Execute code so that it does whatever it needs to do.  In general, use the GetPrerequisites function to fetch the prerequisites.  Use a FOR loop to run the parent Execute function on each of these prerequisites.  Dynamic dispatching will execute the correct code.  You now have an array of the results.  Use this, with whatever other functionality you need, to calculate your final values.
    The prerequisites can be dynamically loaded so you do not have a static link to the prerequisite classes.  If you would like to have a text interface, you can dynamically load the individual functions, then use their values in a LabVIEW formula VI for the final calculation.
    If this is still Greek, you may want to walk through the examples of LabVIEW classes and dynamic dispatch to get more background on how to use classes.
    If you would prefer a text string for your units so that you have more flexibility, let me know.  I have an SI unit string validation VI that may be of use.  It works for most unit combinations, provided they are not nested too deep.
    This account is no longer active. Contact ShadesOfGray for current posts and information.

  • Need ideas for a validation concept

    Hello,
    I am a bit helpless about validations on my page!
    I have a page with a lot of items, which are particularly filled with AJAX.
    When a button is pressed these items should be validated before a page process runs. And of course if a validation fails the process should not run.
    The problem is that the error messages of the validations should be displayed in a javascript box and not in the notification area.
    Further I was not able to call a javascript function from a button and the process only runs if the button was pressed an the javascript validation function returns true!
    And one more problem is that the items are filled by AJAX and because of that the value of these items are sometimes different when I try to reference them in the page process to validate the items.
    So I have no idea to create a good validation concept, which creates a javascript box when a validation fails and the page process only runs if all validations return true.
    I hope you have an idea, how I can do that!
    Thank you,
    Tim

    Hello Tim,
    Validation, especially in a web application, should be a two phase process. The first phase should be on the client side, and there you can use JavaScript, especially for the non-db related validations like not null, valid date, numbers only etc. The second phase should take place on the server side, after page submits, mainly because in the "way" from the client to the server things can be changed and tampered with.
    The fact that you are using AJAX doesn't change this practice. Even if you are using select list (and radio groups or checkboxes are on the same category), based on dynamic LOV, do not assure you that the selected values, received by the sever, are legal ones.
    You can use Andy's example for client side validation, but you'll also need server side validation. You should check Patrick blog on that one.
    " The problem is that the error messages of the validations should be displayed in a javascript box and not in the notification area."Why? Server side validation results (at least the built-in ones) can't be displayed in JavaScript boxes, as this is a server side process. APEX practice is that failed validation stops the page processes, so nothing can be changed as long as you have items, which didn't validate correctly. I believe Patrick's solution presents the validation errors in a very friendly manner, although not in a JavaScript box.
    " And one more problem is that the items are filled by AJAX and because of that the value of these items are sometimes different when I try to reference them in the page process to validate the items."You should give us some more specific details on the way you are populating the item, and the page process (and fire point) you are using. In any case, it is possible that your page process relies on session state, and just using AJAX don't necessarily update session state. In these cases, maybe you should initiate session state updates, prior to submitting the page.
    Regards,
    Arie.

  • [SOLVED]Need ideas for framework level disable on af command components

    Hi all,
    I am using ADF Faces & BC, JDeveloper 10g.
    I need a framework level disable/enable design for every command component on a adf faces page. I can certainly do this one at a time by assigning an el expression on the "disable" attribute individually. However, this would put the burden on each developer to ensure proper authorization code is put in place. I would like to avoid the latter option as it is repetitive, not modular and prone to mistakes. Can anyone provide some ideas? I was thinking of using javascript to pick up special designated componentIds and assign property that way. Also, I've heard of aspect oriented approaches for Java classes, although I'm not sure how well this would integrate into our application. Any advice is appreciated.
    Thanks,
    Wes
    Edited by: Wes Fang on Sep 21, 2010 9:00 AM

    Thanks again for the idea John, I tracked down this thread:
    ADF FACES:Creating custom component on top of adf
    on how to create custom tags, everything is working with the exception one important feature. My custom tags are showing up, but I cannot seem to access the adf binding container within the UIcomponent base. I need to execute a method on the app module to find out if the button should be enabled/disabled. Would you have a solution to this issue? I also found another user with similar question over at:
    Re: Parsing EL expression in custom tag 10.1.3.4
    thanks,
    Wes

  • Need IDE for Mac OS Jaguar

    I have recently made the switch to Mac from Windows, and everything works beautifully for me except for one thing. I can't find any programming tools for C. I would love to use Xcode, but I don't have Tiger, and I don't plan on upgrading. What alternative IDEs could I use?
    Quicksilver 2002   Mac OS X (10.2.x)  

    It's only a big risk when your hard drive crashes or suffers file corruption. A backup is always a good thing to have. I always install a second hard drive for each computer and maintain a regular backup for each one.
    You can easily clone your system to a second drive using the Restore option of Disk Utility:
    How to Clone Using Restore Option of Disk Utility
    1. Open Disk Utility from the Utilities folder.
    2. Select the backup or destination volume from the left side list.
    3. Click on the Erase tab in the DU main window. Set the format type to Mac OS Extended (journaled, if available) and click on the Erase button. This step can be skipped if the destination has already been freshly erased.
    4. Click on the Restore tab in the DU main window.
    5. Select the backup or destination volume from the left side list and drag it to the Destination entry field.
    6. Select the startup or source volume from the left side list and drag it to the Source entry field.
    7. Double-check you got it right, then click on the Restore button.
    8. Select the destination drive on the Desktop and press COMMAND-I to open the Get Info window. At the bottom in the Ownership and Permissions section be sure the box labeled "Ignore Permissions on this Volume" is unchecked. Verify the settings for Ownership and Permissions as follows: Owner=system with read/write; Group=admin with read/write; Other with read-only. If they are not correct then reset them.
    For added precaution you can boot into safe mode before doing the clone.
    You can then use a third-party backup utility to maintain the clone with incremental updates. Some good choices are:
    Retrospect
    Synchronize! Pro X
    Synk 6
    Deja Vu
    All work with Panther and Tiger and can perform both full and incremental backups as well as maintain bootable clones.
    I agree, if all your software works fine there's no need to upgrade unless upgrades provide new features that you can use.
    Why reward points?(Quoted from Discussions Terms of Use.)
    The reward system helps to increase community participation. When a community member gives you (or another member) a reward for providing helpful advice or a solution to their question, your accumulated points will increase your status level within the community.
    Members may reward you with 5 points if they deem that your reply is helpful and 10 points if you post a solution to their issue. Likewise, when you mark a reply as Helpful or Solved in your own created topic, you will be awarding the respondent with the same point values.

  • Need Ideas for creating and using Custom Business Object

    Hello Guys,
    I am developing an application which uses a Request->Approve->Create approach for creating Purchase documents.
    Now I am a little puzzled about how to make use of the Business Object BUS2014.
    The application I am developing has its own unique 'Request Number'  (say REQID)  which will point to the Request for Creation of a purchase order.
    Whenever a Request is created (from a Z-Tcode) a workflow needs to be initiated and it has to be sent to the approver.
    The Purchase Document will be created once the approver approves.
    Now my confusion here is, if I use BUS2014, the object will be instantiated only during the final step of the workflow. But I need an instance during the beginning of the Requestor ->Approver negotiations as I am playing with events. These events needs an Object_key.
    How should I proceed here?
    Should I create a new logical Business Object like ZPOREQ where I have the above mentioned REQID as the key?
    And should I have an attribute of type BUS2014 inside the custom BO?
    How will I make use of the methods like BUS2014.Create etc which I may need to create the purchase document?
    Any small direction will be a huge help for me to get used to this wilderness.

    Hi,
    You should continue with the ABAP class idea. The business objects are kind of "obsolete" already, and if there is a need to create a new "object", ABAP classes are the way to go. Business objects are still useful, but I normally use them only when an existing standard business object fulfills the requirements (possibly with slight additions) which is almost never. 
    From my point of view you can use the existing class. Depending on the circumstances I normally have just one class that I use for both workflow and the possible other functionality that is required, but you have to understand that I have this goal in my mind already when starting the development process. As your class most probably has many useful features already (such as you have the header and item data as attributes etc. (if I understood correctly?), these are also useful in in workflow (class attributes will be available in WF container etc.). 
    If you are hesitant to use the same class directly in your workflow, you could also create a new class ZCL_REQUEST_FOR_WF (with the workflow interface), and then simply add your existing class ZCL_WF_REQUEST as an attribute to this new class. Then this new workflow class could include the pure workflow stuff, and your existing class the non-workflow stuff. But this most probably will not make much sense - just implement the if_workflow interface in your existing class (this is just one possibility that you might consider.)
    Regards,
    Karri

  • Need ideas for new PJC/Java Beans

    Hello everybody,
    I am always looking for new ideas about the Java Bean and PJC stuff. Sometimes I have good ideas about this, but sometimes it is quite a pain to find something new and innovative.
    If you have ideas or needs about this, let me know in this thread.
    (Sorry Oracle staff if I am going beyond my rights by using the Forum for that purpose)
    Francois

    Francois ,
    I think that we all need to thank you for all your hard work promoting Oracle Forms.
    Your input and constant support on this forum is greatly appreciated.
    But I personally think that all this needs to be addressed by Oracle.
    Your wrote
    Sometimes I have good ideas about this, but sometimes it is quite a pain to find something new and innovative.
    And I agree with you.
    You can go as far as the Forms let you go...
    Thanks,
    Michael

  • Need Ideas For Storage Units Data Storage Capabilities - Special Attributes? History? 2 Ind-UMs

    Hello experts,
    The company I'm working for is looking into permanently-storing pallet level information (keep a history of the pallet movements) and use RF-scanners to move product in the warehouse. They have made a decision to implement Warehouse Management's Storage Unit Management functionality. They looked into Handling Units as well, but they don't want to use HUs for many reasons.
    They would also like to store 2 units of measure at the Storage Unit level without activating "Catch Weight Management" because that would require them to run parallel systems for a while and also deal with CWM functionality restrictions. Keep in mind that most of the products they handle are catch-weight products, so UM conversions don't work for them.
    Solutions I have in mind:
    For storing 2 independent UMs: Store the quantity of the 2nd unit of measure in a custom table at the Storage Unit level and use custom RF-scanner programs to "receive, issue, scrap, and move" goods in the warehouse. These custom RF-scanner programs would update SAP standard table with 1st (base) UM and also custom table with 2nd UM.
    For permanenlty-storing SU history: Use custom table to to store Storage Unit History. The custom programs created to handle the SUs would update this custom table.
    Last time I checked, the history of a Storage Unit is not recorded in SAP, correct? ONLY in Handling Units, correct?
    OR are there any documents/tables that permanently store the Storage Unit number so they can be queried after the Storage Unit is consumed/issued?
    I know SAP keeps improving its applications with every release, so I'm just looking at my options here.
    Does anyone else have any other ideas on how to approach this other than Using Handling Units & Catch Weight Management?
    Thanks in advance!
    -Mr. Bello
    Message was edited by: Jürgen L

    For storing 2 independent UMs
    Can you please explore the LS26 option there also system is allowing you to change the parameter"Unit of measure" and displays the stock on different UoM, hopefully this will solve your problem and you need not design a custom table to store the value at different UoM level
    For permanenlty-storing SU history:
    System store the storage unit related value in table : LEIN however the moment you do any consumption or movement to non SU the entries goes off from this table hence i think the approach taken by you seems the only one approach  to store the historical data. (Make sure you are taking into consideration of the archiving activity as you proceed further the size of database will get bigger and time to generate any report will take longer then expected

Maybe you are looking for