I'm a little stumped. I have a form with a VpDayView, TVpBufDSDatastore and TVpControlLink. I pull resource and event data from a remote database and I copy it manually into the TVpBufDSDatastore Resource and Events using two procedures I wrote LoadTVPResource and LoadTVPEvents. See below
// LoadTVPResource
procedure TfrmMain.LoadTVPResource(
ADatastore: TVpBufDSDatastore; AJSON: string);
var
intGridRow, intNumberOfSQLQueryRows: integer;
// JSON related variables
jsParser: TJSONParser;
jsArrayRow: TJSONArray;
jsObj: TJSONObject;
begin
//
if AJSON = EmptyStr then
exit;
// create the json parser
jsParser := TJSONParser.Create(AJSON);
//
try
// Parse the JSON data
jsArrayRow := jsParser.Parse as TJSONArray;
//
try
// get the number of rows returned by the query in the JSON data object
intNumberOfSQLQueryRows := jsArrayRow.Count;
// Empty the dataset
ADataStore.ResourceTable.Close;
ADataStore.ResourceTable.Open;
//AComboBox.Clear;
// append the json rows to the grid
for intGridRow := 0 to Pred(intNumberOfSQLQueryRows) { - 1} do
begin
// assign the object to jsObj
jsObj := jsArrayRow.Objects[intGridRow];
//
try
// All events related to a particular resource
//
with ADataStore.ResourceTable do
begin
//
Append;
//
if not jsObj.Items[0].IsNull then
FieldByName('resourceid').AsInteger := jsObj.Items[0].AsInteger
else
FieldByName('resourceid').Clear;
//
if not jsObj.Items[2].IsNull then
FieldByName('description').AsString := jsObj.Items[2].AsString
else
FieldByName('description').Clear;
//
if not jsObj.Items[3].IsNull then
FieldByName('notes').AsString := jsObj.Items[3].AsString
else
FieldByName('notes').Clear;
//
if not jsObj.Items[4].IsNull then
FieldByName('imageindex').AsInteger := jsObj.Items[4].AsInteger
else
FieldByName('imageindex').Clear;
//
if not jsObj.Items[5].IsNull then
FieldByName('resourceactive').AsBoolean := jsObj.Items[5].AsBoolean
else
FieldByName('resourceactive').Clear;
end;
finally
//
jsObj.Clear;
end;
end; // for intGridRow := 0 to intNumberOfSQLQueryRows - 1 do
finally
//
jsArrayRow.Free;
end; // try...finally (jsParser := TJSONParser.Create(AJSString))
finally
// free the jsParser
FreeAndNil(jsParser);
end;
//
ADataStore.ResourceTable.Active := True;
end;
// LoadTVPEvents
procedure TfrmMain.LoadTVPEvents(
ADatastore: TVpBufDSDatastore; AJSON: string);
var
intGridRow, intNumberOfSQLQueryRows: integer;
// JSON related variables
jsParser: TJSONParser;
jsArrayRow: TJSONArray;
jsObj: TJSONObject;
begin
//
if AJSON = EmptyStr then
exit;
// create the json parser
jsParser := TJSONParser.Create(AJSON);
//
try
// Parse the JSON data
jsArrayRow := jsParser.Parse as TJSONArray;
//
try
// get the number of rows returned by the query in the JSON data object
intNumberOfSQLQueryRows := jsArrayRow.Count;
// Empty the dataset
ADataStore.EventsTable.Close;
ADataStore.EventsTable.Open;
// append the json rows to the grid
for intGridRow := 0 to Pred(intNumberOfSQLQueryRows) { - 1} do
begin
// assign the object to jsObj
jsObj := jsArrayRow.Objects[intGridRow];
//
try
// All events related to a particular resource
//
with ADataStore.EventsTable do
begin
//
Append;
//
if not jsObj.Items[0].IsNull then
FieldByName('recordid').AsInteger := jsObj.Items[0].AsInteger
else
FieldByName('recordid').Clear;
//
if not jsObj.Items[1].IsNull then
FieldByName('resourceid').AsInteger := jsObj.Items[1].AsInteger
else
FieldByName('resourceid').Clear;
//
if not jsObj.Items[3].IsNull then
FieldByName('starttime').AsDateTime := SQLDateToDateTime(jsObj.Items[3].AsString)
else
FieldByName('starttime').Clear;
//
if not jsObj.Items[4].IsNull then
FieldByName('endtime').AsDateTime := SQLDateToDateTime(jsObj.Items[4].AsString)
else
FieldByName('endtime').Clear;
//
if not jsObj.Items[5].IsNull then
FieldByName('description').AsString := jsObj.Items[5].AsString
else
FieldByName('description').Clear;
//
if not jsObj.Items[6].IsNull then
FieldByName('location').AsString := jsObj.Items[6].AsString
else
FieldByName('location').Clear;
//
if not jsObj.Items[7].IsNull then
FieldByName('notes').AsString := jsObj.Items[7].AsString
else
FieldByName('notes').Clear;
//
if not jsObj.Items[8].IsNull then
FieldByName('category').AsInteger := jsObj.Items[8].AsInteger
else
FieldByName('category').Clear;
//
if not jsObj.Items[9].IsNull then
FieldByName('alldayevent').AsBoolean := jsObj.Items[9].AsBoolean
else
FieldByName('alldayevent').Clear;
//
if not jsObj.Items[10].IsNull then
FieldByName('dingpath').AsString := jsObj.Items[10].AsString
else
FieldByName('dingpath').Clear;
//
if not jsObj.Items[11].IsNull then
FieldByName('alarmset').AsBoolean := jsObj.Items[11].AsBoolean
else
FieldByName('alarmset').Clear;
//
if not jsObj.Items[12].IsNull then
FieldByName('alarmadvance').AsInteger := jsObj.Items[12].AsInteger
else
FieldByName('alarmadvance').Clear;
//
if not jsObj.Items[13].IsNull then
FieldByName('alarmadvancetype').AsInteger := jsObj.Items[13].AsInteger
else
FieldByName('alarmadvancetype').Clear;
//
if not jsObj.Items[14].IsNull then
FieldByName('snoozetime').AsDateTime := SQLDateToDateTime(jsObj.Items[14].AsString)
else
FieldByName('snoozetime').Clear;
//
if not jsObj.Items[15].IsNull then
FieldByName('repeatcode').AsInteger := jsObj.Items[15].AsInteger
else
FieldByName('repeatcode').Clear;
//
if not jsObj.Items[16].IsNull then
FieldByName('repeatrangeend').AsDateTime := SQLDateToDateTime(jsObj.Items[16].AsString)
else
FieldByName('repeatrangeend').Clear;
//
if not jsObj.Items[17].IsNull then
FieldByName('custominterval').AsBoolean := jsObj.Items[17].AsBoolean
else
FieldByName('custominterval').Clear;
end;
finally
//
jsObj.Clear;
end;
end; // for intGridRow := 0 to intNumberOfSQLQueryRows - 1 do
finally
//
jsArrayRow.Free;
end; // try...finally (jsParser := TJSONParser.Create(AJSString))
finally
// free the jsParser
FreeAndNil(jsParser);
end;
//
ADataStore.EventsTable.Active := True;
//
if not ADataStore.Connected then ADataStore.Connected := True;
end;
The problem is I don't see the events on the VpDayView in the form. The DayView keeps saying no resource has been selected. Does that mean I have to somehow use a TVpResourceCombo no matter what?
Thanks,
JD