http://qs321.pair.com?node_id=1000876


in reply to Ms Access and win32 ole

Here are some questions that may help:

  1. Are your using Access 2007 or 2010? If you're using an older version, it won't open accdb files.
  2. Can you run Access the normal way (interactively) and open the file successfully?
  3. If you can open it when using the interactive method, what happens if you specify the complete path to the accdb file in your OpenCurrentDatabase call? It's very likely that without the full path Access' current working directory won't be the one where your Perl script and accdb file are located.

Replies are listed 'Best First'.
Re^2: Ms Access and win32 ole
by sumit07 (Novice) on Oct 26, 2012 at 08:56 UTC
    Thank you for the hint Sinistral I was not giving the whole path. You really helped me. Thanks a ton :)
Re^2: Ms Access and win32 ole
by sumit07 (Novice) on Oct 26, 2012 at 10:43 UTC

    Hi Sinistral

    I am now trying to open using this code
    $oDatabase = $oAccess->DBEngine->OpenCurrentDatabase($filename);
    It says invalid argument.Do we need to provide other arguments also.

    With this code $oDatabase = $oAccess->DBEngine->OpenDatabase($filename);

    It opens fine but the custom properties doesnot get added to the file's custom tab in the database properties.
    Is there any difference between OpenDatabase and OpenCurrentDatabase.
    
    my $filename = 'C:\Documents and Settings\551970\Desktop\database.accd +b'; # $ARGV[0]; print $filename."\n"; $oAccess = Win32::OLE->new('Access.Application') or die qq{Couldn't st +art new Access instance!}; # Open Access File $oDatabase = $oAccess->DBEngine->OpenDatabase($filename); my $new_property = $oDatabase->Containers->Databases->Documents->User +Defined->CreateProperty("Test1",12,"Test"); $oDatabase->Containers->Databases->Documents->UserDefined->Propertie +s->Append($new_property); foreach (in $oDatabase->Containers->Databases->Documents->UserDefined- +>Properties) { #print Dumper($_); print "prop ".$_->Name."\n"; } undef $oDatabase; #undef $oAccess; $oAccess->Quit();

      Most of my Win32::OLE experience has been with Excel, not Access, but a little Googling found this link: http://msdn.microsoft.com/en-us/library/office/bb238012(v=office.12).aspx which specifically says that OpenCurrenDatabase is for manipulating Access and opening files, while OpenDatabase returns a Database variable but doesn't actually open the file in the Access window. So for you, you want OpenCurrentDatabse. Beyond that, the best thing I can offer is to check out the documents I linked to, which are the Automation docs for Access 2007 (switch to 2010 if that's what you're using).

      The other tip I've seen is to record a macro of the task you're trying to achieve and examine the VBA code that Access creates. It looks like you're on your way already to knowing the Perl Win32::OLE to VBA equivalent