FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Syntactical compiler error
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Syntactical compiler error
Posted: Wed Jul 27, 2011 06:05 PM

To All

I have been working on a Web Crawler app and I am creating a code block to run a method that passes parameters and envokes IE ..

I have a web site I am trying to load that has a hyphen in the DOM string ..

document:forms:tsf:lst-ib

The code block compiles but errors out ..

cSFD := "document:forms:tsf:lst-ib"
bSFD := &( [ { | IE | IE:]+cSFD+[:Value := "]+cPARTS+[" } ] )

When I try it the hard coded way ..

IE:document:forms:tsf:lst-ib:Value := cPARTS

The compiler errors on the hyphen between lst and ib .. and I feel here is the crux of the code block error..

Anyone know how to compile this method string ?

IE:document:forms:tsf:lst-ib:Value := cPARTS

Thanks
Rick Lipkin

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Syntactical compiler error
Posted: Thu Jul 28, 2011 03:01 AM
Mr Rick
I had seen your earlier postings on this subject and the trouble you went through making the above codeblock.

I would prefer a different approach, which would even make your program more readable.

Here is a function I suggest. I have not tested, but please let me know the result. Keep this function available to all your modules.

Code (fw): Select all Collapse
function OSendMulti( cStr, uVal )

   local aMsg  := HB_ATokens( cStr, ":" )
   local o     := aMsg[ 1 ]
   local n     := Len( aMsg ) - If( uVal == nil, 1, 2 )
   
   AEval( aMsg, { |c| o := OSend( o, c ) }, 2, n )
   if uVal != nil
      OSend( o, ATail( aMsg ), uVal )
   endif
   
return o


You can use this function like this:
Code (fw): Select all Collapse
OSendMulti( "IE:tsf:lst-ib:Value", cPARTS )

You can even use macros inside the first parameter as you like.
Second parameter is optional. If specified, second parameter is assigned. If not assigned the function returns the value of the first parameter.
Regards



G. N. Rao.

Hyderabad, India
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: Syntactical compiler error
Posted: Thu Jul 28, 2011 12:50 PM
Rao

I like your option much better .. the code did error out.

Appreciate your help ..

Thanks
Rick

Application
===========
Path and name: C:\Fox\WebCrawl\WebCrawl.Exe (32 bits)
Size: 3,095,040 bytes
Time from start: 0 hours 0 mins 18 secs
Error occurred at: 07/28/2011, 08:40:04
Error description: Error BASE/3000 Argument error: __OBJSENDMSG
Args:
[ 1] = C IE
[ 2] = C document

Stack Calls
===========
Called from: => __OBJSENDMSG(0)
Called from: => HB_EXECFROMARRAY(0)
Called from: .\source\function\HARBOUR.PRG => OSEND(221)
Called from: FUNC_LIB.PRG => (b)OSENDMULTI(336)
Called from: => AEVAL(0)
Called from: FUNC_LIB.PRG => OSENDMULTI(336)
Called from: Vendor1.prg => _VENDOR1(440)
Called from: URLTEST.PRG => (b)_URLTEST(131)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:CLICK(445)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:LBUTTONUP(631)
Called from: => TWINDOW:HANDLEEVENT(0)
Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT(1469)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:HANDLEEVENT(1295)
Called from: .\source\classes\WINDOW.PRG => _FWH(3347)
Called from: => WINRUN(0)
Called from: .\source\classes\WINDOW.PRG => TMDIFRAME:ACTIVATE(966)
Called from: main.prg => MAIN(270)

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Syntactical compiler error
Posted: Thu Jul 28, 2011 01:58 PM
Mr Rick

I am extremely sorry. My mistake.
Please try this function:
Code (fw): Select all Collapse
function OSendMulti( o, cMsg, uVal )

   local aMsg  := HB_ATokens( cMsg, ":" )
   local n     := Len( aMsg ) - If( uVal == nil, 0, 1 )
   
   AEval( aMsg, { |c| o := OSend( o, c ) }, 1, n )
   if uVal != nil
      OSend( o, ATail( aMsg ), uVal )
   endif
   
return o

Usage:
Code (fw): Select all Collapse
OSendMulti( IE, "document:tsf:lst-ib:Value", cPARTS )

First parameter the main Object.
Second parameter all messages delimited with ":"
Third parameter optional value to be assigned.
Regards



G. N. Rao.

Hyderabad, India
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: Syntactical compiler error
Posted: Thu Jul 28, 2011 02:09 PM

Rao

AWESOME !!!! .. works GREAT !!!!

Appreciate your expertise !
Rick Lipkin

Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: Syntactical compiler error
Posted: Thu Jul 28, 2011 03:01 PM
Rao

Ran into another problem .. it seems when there is a function parameter within the DOM string :item(0) I get an error ..

Thanks
Rick Lipkin

Code (fw): Select all Collapse
cSFD := "document:item(0):search"
OSendMulti( IE, cSFD+":Value", cPARTS )   // in func_lib.prg


Application
===========
Path and name: C:\Fox\WebCrawl\WebCrawl.Exe (32 bits)
Size: 3,095,040 bytes
Time from start: 0 hours 0 mins 18 secs
Error occurred at: 07/28/2011, 10:52:15
Error description: Error InternetExplorer.Application:FORMS/0 S_OK: ITEM(0)
Args:

Stack Calls
===========
Called from: source\rtl\win32ole.prg => TOLEAUTO:ITEM(0)(0)
Called from: => __OBJSENDMSG(0)
Called from: => HB_EXECFROMARRAY(0)
Called from: .\source\function\HARBOUR.PRG => OSEND(221)
Called from: FUNC_LIB.PRG => (b)OSENDMULTI(334)
Called from: => AEVAL(0)
Called from: FUNC_LIB.PRG => OSENDMULTI(334)
Called from: Vendor1.prg => _VENDOR1(447)
Called from: URLTEST.PRG => (b)_URLTEST(131)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:CLICK(445)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:LBUTTONUP(631)
Called from: => TWINDOW:HANDLEEVENT(0)
Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT(1469)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:HANDLEEVENT(1295)
Called from: .\source\classes\WINDOW.PRG => _FWH(3347)
Called from: => WINRUN(0)
Called from: .\source\classes\WINDOW.PRG => TMDIFRAME:ACTIVATE(966)
Called from: main.prg => MAIN(270)

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Syntactical compiler error
Posted: Fri Jul 29, 2011 12:35 AM
Rao

Ran into another problem .. it seems when there is a function parameter within the DOM string :item(0) I get an error

Yes. (x) and [x] as part of the string does not work now.
Regards



G. N. Rao.

Hyderabad, India
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Syntactical compiler error
Posted: Fri Jul 29, 2011 01:53 AM
Please try this revised function as it is:
Code (fw): Select all Collapse
function OSendMulti

   local n

   PARAMETERS o, cMsg, uVal

   if PCount() > 2
      if ( n := RAt( ":", cMsg ) ) > 0
         o     := &( "o:" + Left( cMsg, n - 1 ) )
         cMsg  := SubStr( cMsg, n + 1 )
      endif
      o  := OSend( o, cMsg, uVal )
   else
      o  := &( "o:" + cMsg )
   endif

return o
Regards



G. N. Rao.

Hyderabad, India
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: Syntactical compiler error
Posted: Fri Jul 29, 2011 02:33 PM
Rao

YES .. the functions and parameters are now working .. however the dom string that contains a "-" hyphen again is broke


Code (fw): Select all Collapse
cSFD := "document:tsf:lst-ib"
OSendMulti( IE, cSFD+":Value", cPARTS )   // in func_lib.prg


Application
===========
Path and name: C:\Fox\WebCrawl\WebCrawl.Exe (32 bits)
Size: 3,095,040 bytes
Time from start: 0 hours 0 mins 23 secs
Error occurred at: 07/29/2011, 09:30:47
Error description: Error InternetExplorer.Application:TSF/0 S_OK: LST
Args:

Stack Calls
===========
Called from: source\rtl\win32ole.prg => TOLEAUTO:LST(0)
Called from: FUNC_LIB.PRG => OSENDMULTI(337)
Called from: Vendor1.prg => _VENDOR1(451)
Called from: URLTEST.PRG => (b)_URLTEST(131)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:CLICK(445)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:LBUTTONUP(631)
Called from: => TWINDOW:HANDLEEVENT(0)
Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT(1469)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:HANDLEEVENT(1295)
Called from: .\source\classes\WINDOW.PRG => _FWH(3347)
Called from: => WINRUN(0)
Called from: .\source\classes\WINDOW.PRG => TMDIFRAME:ACTIVATE(966)
Called from: main.prg => MAIN(270)




I can certainly live with both iterations of your code and set a try, catch, end try on your latest code .. and if it fails .. catch and try the first function ..

From what I have seen from various web sites .. functions with parameters in the DOM string are always present .. only the use of a "-" hyphen is very rare and probably meant to defeat exactly what I am trying to do .. Some of these web masters even rotate their DOM strings hourly and change the last element so any stored DOM string becomes stale .. I have had to defeat that bugger too .. with a for next loop and test for other attributes like "name" = "submit" instead of the direct DOM address..

Been quite an interesting education ..

Rick Lipkin
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Syntactical compiler error
Posted: Fri Jul 29, 2011 02:41 PM

Yes.
Macros can not handle "-" and OSend (as I am using) can not handle "(x)"
I am thinking of how to make a better function to handle either situation.

Soon I shall post here

Regards



G. N. Rao.

Hyderabad, India
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: Syntactical compiler error
Posted: Fri Jul 29, 2011 03:02 PM
Rao

A single function would be great .. I have been looking at the differences between your two iterations thinking I could test for one type of parameter or another .. I did try a dual try catch end try and got it working .. one other possibility that would defeat this strategy would be a combination of both "-" hyphen and :Item(0) in the same DOM string :-)

Rick


Code (fw): Select all Collapse
*IE:document:forms:item(0):search:Value = cPARTS
*cSFD := "document:tsf:lst-ib"
*IE:document:forms:tsf:lst-ib:Value := cPARTS
*IE:document:forms:item(0):search:Value := cPARTS
*cSFD := "document:item(0):search"
*OSendMulti( IE, cSFD+":Value", cPARTS )   // in func_lib.prg

try
  * bSFD := &( [ { | IE | IE:]+cSFD+[:Value := "]+cPARTS+[" } ] )
   OSendMulti( IE, cSFD+":Value", cPARTS )   // in func_lib.prg
catch
   try
     OSendMulti1( IE, cSFD+":Value", cPARTS )   // in func_lib.prg
   catch
      cSAY := "Inserting part number "+cPARTS+"  FAILED"
      oSay:ReFresh()
      SysReFresh()

      aLINE := { cURL,cPARTS,cSAY,"   ", "    ", "  " }
      AAdd( aResults, aLine )
      oLbx2:Refresh()
      oLbx2:GoBottom()

      SysReFresh()

      try
         IE:Quit()
      catch
      end try

      IF cTESTING = "TEST"
         oBtn1:Enable()
         oBtn2:Enable()
      ENDIF

      SysReFresh()
      RETURN(.F.)
   end try
end try

*eval( bSFD, IE )

cSAY := "Inserting part number "+cPARTS+"  DONE"
oSay:ReFresh()
SysReFresh()

SysWait(1)
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Syntactical compiler error
Posted: Sat Jul 30, 2011 07:30 AM
Mr Rick

Now please try this function and let me know how this works.
Code (fw): Select all Collapse
function OSendMulti( o, cMsg, uVal )

   local aMsg  := HB_ATokens( cMsg, ":" )
   local n     := Len( aMsg ) - If( uVal == nil, 0, 1 )
   local p

   AEval( aMsg, { |c| o := OSendEx( o, c ) }, 1, n )
   if uVal != nil
      OSend( o, ATail( aMsg ), uVal )
   endif

return o

function OSendEx( o, c )

   local p, nAt

   if ( nAt := At( '(', c ) ) > 0
      p     := SubStr( c, nAt + 1 )
      c     := Left( c, nAt - 1 )
      p     := &( Left( p, At( ')', p ) - 1 ) )
      o     := OSend( o, c, p )
   else
      o     := OSend( o, c )
   endif

return o

Note: OSendMulti uses OSendEx function. Please keep both of them in your lib.
Regards



G. N. Rao.

Hyderabad, India
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: Syntactical compiler error
Posted: Sat Jul 30, 2011 05:08 PM
Rao

You have solved the hyphen "-" and the :item(0) function .. however the code does not now handle this type of method where you have an action .. like Click()

cSSBD := "document:all:go"
OSendMulti( IE, cSSBD+":Click()", ) // in func_lib.prg

Application
===========
Path and name: C:\Fox\WebCrawl\WebCrawl.Exe (32 bits)
Size: 3,103,744 bytes
Time from start: 0 hours 0 mins 56 secs
Error occurred at: 07/30/2011, 09:35:31
Error description: Error BASE/1449 Syntax error: &
Args:
[ 1] = C

Stack Calls
===========
Called from: FUNC_LIB.PRG => OSENDEX(350)
Called from: FUNC_LIB.PRG => (b)OSENDMULTI(335)
Called from: => AEVAL(0)
Called from: FUNC_LIB.PRG => OSENDMULTI(335)
Called from: Vendor1.prg => _VENDOR1(640)
Called from: URLTEST.PRG => (b)_URLTEST(131)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:CLICK(445)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:LBUTTONUP(631)
Called from: => TWINDOW:HANDLEEVENT(0)
Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT(1469)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:HANDLEEVENT(1295)
Called from: .\source\classes\WINDOW.PRG => _FWH(3347)
Called from: => WINRUN(0)
Called from: .\source\classes\WINDOW.PRG => TMDIFRAME:ACTIVATE(966)
Called from: main.prg => MAIN(270)



However .. if I remove the parenthesis :Click() to :Click .. your solution works and the method fires properly without the parenthesis !!

Rick Lipkin
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Syntactical compiler error
Posted: Sat Jul 30, 2011 06:04 PM
Please try this now:
Code (fw): Select all Collapse
function OSendMulti( o, cMsg, uVal )

   local aMsg  := HB_ATokens( cMsg, ":" )
   local n     := Len( aMsg ) - If( uVal == nil, 0, 1 )
   local p

   AEval( aMsg, { |c| o := OSendEx( o, c ) }, 1, n )
   if uVal != nil
      OSend( o, ATail( aMsg ), uVal )
   endif

return o

function OSendEx( o, c )

   local p, nAt

   if ( nAt := At( '(', c ) ) > 0
      p     := SubStr( c, nAt + 1 )
      c     := Left( c, nAt - 1 )
      p     := Left( p, At( ')', p ) - 1 )
   endif
   o  := If( Empty( p ),  OSend( o, c ), OSend( o, c, &p ) )

return o

Still this does not work for more than one parameter inside (..). We shall handle that later.
Regards



G. N. Rao.

Hyderabad, India
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: Syntactical compiler error
Posted: Sat Jul 30, 2011 06:35 PM
Rao

The parameters seem to now work :Click() and :Item(0) .. however, now the "-" is erroring .. I appreciate your tenacity .. I know it is difficult to test this without the code.

Very appreciative !
Rick Lipkin

Code (fw): Select all Collapse
cSFD := "document:tsf:lst-ib"
OSendMulti( IE, cSFD+":Value", cPARTS )   // in func_lib.prg



Application
===========
Path and name: C:\Fox\WebCrawl\WebCrawl.Exe (32 bits)
Size: 3,101,184 bytes
Time from start: 0 hours 0 mins 55 secs
Error occurred at: 07/30/2011, 14:27:01
Error description: Error BASE/1449 Syntax error: &
Args:
[ 1] = C lst-ib

Stack Calls
===========
Called from: FUNC_LIB.PRG => OSENDEX(352)
Called from: FUNC_LIB.PRG => (b)OSENDMULTI(335)
Called from: => AEVAL(0)
Called from: FUNC_LIB.PRG => OSENDMULTI(335)
Called from: Vendor1.prg => _VENDOR1(453)
Called from: URLTEST.PRG => (b)_URLTEST(131)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:CLICK(445)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:LBUTTONUP(631)
Called from: => TWINDOW:HANDLEEVENT(0)
Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT(1469)
Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:HANDLEEVENT(1295)
Called from: .\source\classes\WINDOW.PRG => _FWH(3347)
Called from: => WINRUN(0)
Called from: .\source\classes\WINDOW.PRG => TMDIFRAME:ACTIVATE(966)
Called from: main.prg => MAIN(270)