How use AdsCopyTableStructure to create ttAdsCDX table - advantage-database-server

Using Advantage Server 9x, I am trying to create a copy of a DBF/CDX table structure using the following code:
table1.AdsCopyTableStructure(d.AdsConnectionTemp.connectPath+'table.dbf');
The table that is created is of the type ttAdsADT, even though the original table is ttAdsCDX.
I tried using AdsConvertTable on the resulting table, but it pops an exception complaining that the operation cannot be done on free tables.
Any way to do this?

I was not able to get this function to work, but came up with a work around by using the following code:
t:=TAdsTable.create(nil);
try
t.AdsTableOptions.AdsFilterOptions:=RESPECT_WHEN_COUNTING;
t.open;
t.AdsSetAOF('keyval=-1'); // gives an empty result
t.AdsCopyTable('c:\somewhere\emlt.dat');
t.close;
finally
freeAndNil(t);
end;

You have a couple of options.
If you don't mind having a single record you can always do
Select top 1 * into mynewtable.dbf from oldtable
which is quick
A second option would be to do your first method, saving it to an adt file (which is the default) then open THAT table and use ADSConvertTable function to create the DBF.
ADTTable.ADSTableConvert('dbftable.dbf',ttADSCDX);

Related

How to get data from two databases via FastReport

I have created a report using FastReport Designer (Delphi 2010). I have one TfrxIBXQuery (Query1) connected with main database -Base1(frxIBXComponents.DefaultDatabase:=Base1). It works fine, I can get data using Query1+MasterData band.
The problem arises when I'm trying to get data from another database in the same report.
In Designer I drop new frxIBXDatabase (Base2), set the necessary properties. Add new TfrxIBXQuery (Query2) and connect it with Base2.
But I can't get any data from Query2 because it does not see Base2.
How do I solve this problem?
When you look at the properties tab from your query component, can you see any FieldAliases?
If not, you should check the SQL, FastReport can be really picky when it comes to parameters.
Try changing parameter names and see if that works.
If you want to use two or more databases inside report - you should use two TfrxIBXDatabase inside report (on the Data tab)
Clear frxIBXComponents.DefaultDatabase property

BDE says "Field not found" but field exists

I have the following query to one of my database tables:
select count(*) as mycount
from mytable
where fieldone = :fieldone
and fieldtwo = :fieldtwo
Parameters are correctly loaded into the query (both of type String).
When I run this query outside the app (for instance, through the dbexplore) and replace the parameters with the actual values, I get the correct result. But when running it in the app, I get a Field 'fieldtwo' not found error, right on the Query.Open call.
Why would the BDE not find this field, when it actually exist?
Update: The following query, executed right after the first one (the one that fails), works fine in the app:
select *
from mytable
where fieldone = :fieldone
order by fieldone, fieldtwo
The best guess is that you have populated the field list in the query, this overrides any concept of the underlying fields that are in the query and is a cause of countless confusion.
Right click on the query, pick the fields editor clear all the values that are there and then choose 'add all fields' that should cause the missing field to appear once the query is executed.
I think it should auto-populate the fields if there are no defined fields when the query is executed, so you may not need to choose 'add all fields' after clearing the fields.
Whenever we come across a problem like this we tend to remove the query from the form and create it dynamically at run time... It depends how ingrained into the form it is...
E.g. If you have a data aware control looking at "fieldtwo" which tries to fetch some data when the underlying data set gets updated then it'll trigger an error like this, but it's more obvious when you've written code such
SomeEdit.Text = Query.FieldByName("fieldtwo").AsString;
That way it falls over on the relevant line instead of the open (triggering a related event)
Clear the query content using Query1.SQL.Clear; statement before opening it.
Other reason can be you are opening other database which may not have the specified field. Be sure that both the DatabaseName's in your app and dbexplore are same
I used to face porblems with BDE when i have SQLExplorer open and the app accesses the DB at the same time (but i had errors like ), try closing the Explorer it may help, if not i would build the SQL as text without the Parameters and try if it works then (if its possible in your situation).
I don't use parameters, so I'm just grabbing at straws here. I still use the BDE regularly, but am no expert. I find I shy away from more complex expressions (which yours is not!) because of the little "surprises" like this that the BDE throws at you.
Perhaps adding parentheses:
where (fieldone = :fieldone)
and (fieldtwo = :fieldtwo)
Or, single or double quote signs (this probably will make it worse?)
where (fieldon = ":fieldone")
and (fieldtwo = ":fieldtwo")
Or, to explore the problem, remove the "and fieldtwo = :fieldtwo" line and see if it runs.
Would it be possible for you to do your own parameter substitution with a StringReplace as in
Query1.SQL.Text := StringReplace(Query1.SQL.Text, ":fieldone", "MyVarName",[rfReplaceAll ]);
If you are creating a ClienDataSet in memory by the Create DataSet method, you should check the TFieldDefs property, which must have a different field name or not created
I was having a weird but small problem, I'll post in case it will help someone in some day.
uRegPeople.pas
with frmEditPerson do
begin
PersonID := qryPerson.FieldByName(ID).AsInteger;
...
end;
I had qryPerson both in frmRegPeople and in frmEditPerson, by using with I was referencing to frmEditPerson.qryPerson, however I wanted to reference to frmRegPeople.qryPerson. Then I need to change to the following code.
with frmEditPerson do
begin
PersonID := Self.qryPerson.FieldByName(ID).AsInteger;
...
end;
// Explanation
// qryPerson --> frmEditPerson.qryPerson;
// Self.qryPerson --> frmRegPeople.qryPerson;

insert to a different table onNewRecord

got an ADOQuery that has OnNewRecord event.
on the procedure i try to add data automaticaly to another table. the data is a few rows that are needed and handled in clientDataSet in case of cancellation.
at the loc
OtherAdoQuery.insert;
I get error that ADOQuery failed to insert null into a non null field. I am in insert mode, however I NEVER ASKED DELPHI TO POST! i dont find why it posts.
Edit: could you help me find a hint on this problem?
some more clarification:
at
ADOQuery.onNewRecord();
begin
CliendDataSet.insert; //here goes to post for ADOQueryPost. where ClientDataSet was in Browse State
end;
Edit:
this bug does not make sense! look at the stack trace:
beforePost
newRecord
myFunc
where myFunc does cause NewRecord with the Insert.
I'm not too familiar with TAdoQuery, but I know how to track down an error like this. First, if you don't already have it set, go into Project Options and turn on Use Debug DCUs under the Compile tab, then run a full build and run it. When you get that exception report in the debugger, hit Break and you should end up inside the code for the TAdoQuery or one of its sub-objects. Try examining the call stack. If you look up a few calls you'll probably find something that you did is calling something else that's calling Post. Follow the stack trace back until you reach your code and you'll get an idea of what's going on, and if you analyze it a little you should find some way to prevent the problem.
Having said that, let me make a quick guess as to the cause of your problem: When you call Insert on a dataset, if the dataset is already in appending mode because you previously called Insert or Append and didn't follow up with a Post, it will call Post itself before setting up a new row for you to work on. Maybe this is what's happening to you?
the answer was from a connection between the tables.
the ADOQuery.dataSource was set the DataSet of the ClientDataSet.
this mad so much damage, and no hint by the delphi.

Save Conflict Error when trying to add new List Items at the time of list creation

We have created a Custom List template programmatically using Feature.xml, Element.xml, Schema.xml AllItems.aspx, and 3 aspx forms. We have a code behind file for each of these aspx files. i.e. for the AllItems.aspx, DispForm.aspx, EditForm.aspx and NewForm.aspx.
Problematic file is AllItems.aspx. In the code behind for AllItems.aspx file we are deleting previous list items and adding new items to the list before showing them up to the user. As per expectations the code behind file for AllItems.aspx is derived from WebPartPage Class and we have tried to overload quite a few methods without much success.
Problem only occurs on the first time rendering i.e. when an instance of this list is created. When overriding OnLoad(), we get the Save conflict error, Similar is the case with OnInit(), CreateChildControls() method. However, when we override the Render() or RenderChildren() method no such error comes up but at the same time our new list items are also not visible. On browser refresh everything starts working fine as expected. It is only for the first time that the issue comes up.
What could be the possible cause for this? Any ideas, suggestions would be highly appreciated.
Best Regards,
Raghu
I had a problem with a custom EditForm.aspx. I have two lists that are linked together and a change in one causes an event handler to update the other. I have a custom control in EditForm.aspx that edits the linked list. This was causing the event handler to update the item displayed by EditForm.aspx. This in turn would cause the conflict error when the user saved the form.
I finally found that I could reset the context with:
SPContext.Current.ResetItem();
I am not sure if this will help in your case but it fixed my problem.

Dynamics AX 2009 - Modify insert into smmActivities from ProjTableWizard?

I am an AX newbie, and I need to make a modification to the ProjTableWizard form code and have not been able to locate where I need to make the change. Essentially what I need to do is modify the part of the Wizard process when creating a sub-project. I need to figure out how a line is inserted into the smmActivities table, so that I can modify the “Activity Purpose” field (prefix it with the Activity Purpose of its parent Project from the ProjTable Form) following the “Finish” button click on the ProjTableWizard form. So far I have been unable to figure out how the ProjTableWizard form is triggering this insert into smmActivities (and how the Purpose field is being populated from the Wizard). Any help would be greatly appreciated! Thanks
To locate the code that is creating smmActivities records, set a breakpoint in the smmActivities.insert() method, then run the ProjTableWizard. Once the debugger pops up, you can view the stack trace to see where the insert was called from.
When using the ProjTableWizard to create a project from a template, the smmActivities records are created in the class method HierarchyTemplateCopying.copyActivity(). It looks like the Purpose field is simply copied from the smmActivities records associated with the template.

Resources