Để có cái nhìn tổng quan, nên xem ghi chép thử nghiệm kbmMW phiên bản 5.07.00 trước khi tiếp tục nội dung dưới đây.
1. Vấn đề sao lưu tự động tệp cấu hình của kbmMWConfiguration vẫn chưa được khắc phục.
Dưới đây là nội dung đã được viết trước đây, một lần nữa được đề xuất trong nhóm tin:
kbmMW cung cấp một đối tượng quản lý thông tin cấu hình mạnh mẽ, đã được dịch giới thiệu trước đây. Trong quá trình sử dụng, phát hiện một vấn đề, đó là thuộc tính TkbmMWCustomConfigurationStorage.BackupMaxCount, khi được đặt là 0, vẫn tạo tệp sao lưu thông tin cấu hình. Trong phiên bản kbmMW 5.05.11 mới nhất, mỗi lần chạy lại tạo một tệp cấu hình, vì vậy đã sửa đổi mã nguồn.
Mở tệp đơn vị kbmMWGlobal, tìm phương pháp sau:
function kbmMWBackupFile,
....
if not FileExists(AFile) then
begin
Result:=AFile;
exit;
end;
if AMaxBackups<=0 then//Kiểm tra AMaxbackups để quyết định có tạo tệp sao lưu không:
begin
Result:=AFile;
exit;
end;
...
2018-7-28: Tác giả cuối cùng đã hết kỳ nghỉ, trả lời rằng sẽ sửa trong phiên bản tiếp theo, giá trị 0 không sao lưu, bằng 0 là vô hạn sao lưu. **2. TkbmMWConfigurableObject không hỗ trợ đa nền tảng. (Đã giải quyết trong phiên bản 5.08)**Trong nhóm tin đã đề cập vấn đề với TkbmMWConfigurableObject, hôm nay kiểm tra phát hiện:``` TSysConnectionParam = class//(TkbmMWConfigurableObject) private [kbmMW_Config('QueryServiceVersion',mwcdReadWrite)] FQueryServiceVersion: string;
[kbmMW_Config('QueryServiceName',mwcdReadWrite)]
FQueryServiceName: string;
[kbmMW_Config('SessionName',mwcdReadWrite)]
FSessionName: string;
[kbmMW_Config('FileServiceVersion',mwcdReadWrite)]
FFileServiceVersion: string;
[kbmMW_Config('FileServiceName',mwcdReadWrite)]
FFileServiceName: string;
public property SessionName: string read FSessionName write FSessionName; property QueryServiceName: string read FQueryServiceName write FQueryServiceName; property QueryServiceVersion: string read FQueryServiceVersion write FQueryServiceVersion; property FileServiceName:string read FFileServiceName write FFileServiceName; property FileServiceVersion:string read FFileServiceVersion write FFileServiceVersion; end;
Đối tượng TSysConnectionParam không kế thừa từ TkbmMWConfigurableObject, nếu không sẽ gặp lỗi trên nền tảng android: **Type (TSysConnectionParam@6260DC60) not registered as a known type.**
Điều này cho thấy TkbmMWConfigurableObject vẫn tồn tại vấn đề đa nền tảng.
Vì không thể kế thừa từ TkbmMWConfigurableObject, làm thế nào để thực hiện một đối tượng cấu hình tự động đọc và lưu? Theo hướng dẫn Configuration REST easy with kbmMW #7.
Ghi đè phương thức **AfterConstruction** và **BeforeDestruction** cho đối tượng cấu hình, để thực hiện tự động lưu và đọc đối tượng cấu hình!
public procedure AfterConstruction; override; procedure BeforeDestruction; override;
{ TSysConnectionParam }
procedure TSysConnectionParam.AfterConstruction; begin inherited; Config.ReadConfig(Self); end;
procedure TSysConnectionParam.BeforeDestruction; begin Config.WriteConfig(Self); inherited; end;
Bây giờ, khi phiên bản của TSysConnectionParam được tạo và giải phóng, nó có thể tự động đọc và lưu tham số, đã được kiểm tra thành công trên Win32 và Android.
Mặc dù TkbmMWConfigurableObject tồn tại vấn đề đa nền tảng, nhưng sử dụng phương pháp trên để bỏ qua cũng là một giải pháp tốt, vì có thể sử dụng khung kbmMWConfiguration trên đa nền tảng!
**3. Lỗi stream read error khi gửi dữ liệu bằng giao dịch trên client:**```
procedure TmainForm.Button3Click(Sender: TObject);
begin
kbmMWClientQuery1.Close;
kbmMWClientQuery2.Close;
kbmMWClientQuery1.Open;
kbmMWClientQuery2.Open;
kbmMWClientQuery1.AppendRecord([1,'1']);
kbmMWClientQuery1.AppendRecord([1,'2']);//Bảng t1 trong CSDL có lỗi trùng khóa chính
kbmMWClientQuery2.AppendRecord([1,'1']);
kbmMWClientQuery2.AppendRecord([1,'2']);//Bảng t2 trong CSDL có lỗi trùng khóa chính
kbmMWClientTransactionResolver1.Resolve([kbmMWClientQuery1,kbmMWClientQuery2]);
end;
Đây là mã kiểm tra, đồng thời gửi hai ClientQuery, mỗi bảng đều có lỗi trùng khóa chính, gây ra tình huống gửi thất bại, lúc này client sẽ tạo ra ngoại lệ: stream read error.
Đã phản hồi về nhóm tin chính thức, nhưng tác giả vẫn yêu cầu viết một demo, đã gửi cho anh ấy, đang chờ xử lý. Lưu ý: vấn đề này đã tồn tại ở phiên bản trước.
4. Vấn đề cập nhật khóa chính
Đây là vấn đề bạn bè gặp phải trong quá trình học tập, đã sắp xếp dự án kiểm tra, tình hình cơ bản như sau:
Hiện có bảng t1, FID là khóa chính, giả sử có các bản ghi sau
FID FName
1 1
2 2
Thay đổi bản ghi đầu tiên, FID thành 2, gửi, lúc này khóa chính trùng, gửi thất bại, lúc này kết quả làm việc của kbmMW là đúng
FID FName
1 1
2 2
Bây giờ thay đổi FID của bản ghi đầu tiên thành 3, gửi, lúc này không còn vấn đề trùng khóa chính, gửi thành công, lúc này kết quả làm việc của kbmMW cũng là đúng.
FID FName
3 1
2 2
Bây giờ thay đổi giá trị của bất kỳ trường nào trong bản ghi đầu tiên, ví dụ FName thành 2, gửi thất bại, kết quả này không đúng. Vấn đề nằm ở đây.
FID FName
3 2
2 2
Đây là mã viết theo phương pháp kiểm tra trên, tái hiện vấn đề:
procedure TmainForm.Button4Click(Sender: TObject);
begin
//Đây là một lỗi
Label1.Caption := ''; Memo1.Lines.Clear;
// Xóa tất cả bản ghi
kbmMWClientQuery1.Close;
kbmMWClientQuery1.Open;
kbmMWClientQuery1.DeleteRecords;
kbmMWClientQuery1.Resolve;
kbmMWClientQuery1.AppendRecord([1, '1']);
kbmMWClientQuery1.AppendRecord([2, '2']);
kbmMWClientQuery1.Resolve;
// keyfield
//
// 1,2 2,2 3,2 3,1
// 2,2 2,2 2,2 2,2
// error ok error
kbmMWClientQuery1.Close;
kbmMWClientQuery1.Open;
kbmMWClientQuery1.First;
kbmMWClientQuery1.Edit;
kbmMWClientQuery1.FieldByName('fid').AsInteger := 2;//Khóa chính trùng
if not kbmMWClientTransactionResolver1.Resolve([kbmMWClientQuery1]) then
begin
DataSource3.DataSet := kbmMWClientQuery1.InfoTable;
Label1.Caption := kbmMWClientQuery1.InfoTable.FieldByName('kbmMW_ErrorMessage').AsString;
Memo1.Lines.Add('Bước 1: Thay đổi khóa chính tạo lỗi, gửi thất bại, đây là đúng. '+kbmMWClientQuery1.InfoTable.FieldByName('kbmMW_ErrorMessage').AsString);
end;
kbmMWClientQuery1.First;
kbmMWClientQuery1.Edit;
kbmMWClientQuery1.FieldByName('fid').AsInteger := 3;//Đặt khóa chính không trùng
if not kbmMWClientTransactionResolver1.Resolve([kbmMWClientQuery1]) then
begin
DataSource3.DataSet := kbmMWClientQuery1.InfoTable;
Label1.Caption := kbmMWClientQuery1.InfoTable.FieldByName('kbmMW_ErrorMessage').AsString;
Memo1.Lines.Add('Bước 2: Thay đổi khóa chính để giải quyết lỗi và gửi thành công, đây là đúng. '+kbmMWClientQuery1.InfoTable.FieldByName('kbmMW_ErrorMessage').AsString);
end
else
begin
Memo1.Lines.Add('Bước 2: Bước 2: Thay đổi khóa chính để giải quyết lỗi và gửi thành công, đây là đúng.');
Label1.Caption := 'Resolve OK.';
end;
kbmMWClientQuery1.First;
kbmMWClientQuery1.Edit;
kbmMWClientQuery1.FieldByName('fname').AsString := '1';//Không thể sửa bản ghi này! Đây là lỗi.
if not kbmMWClientTransactionResolver1.Resolve([kbmMWClientQuery1]) then
begin
DataSource3.DataSet := kbmMWClientQuery1.InfoTable;
Label1.Caption := kbmMWClientQuery1.InfoTable.FieldByName('kbmMW_ErrorMessage').AsString;
Memo1.Lines.Add('Bước 3: Thay đổi bất kỳ trường nào và không thể gửi, đây là lỗi. '+kbmMWClientQuery1.InfoTable.FieldByName('kbmMW_ErrorMessage').AsString);
end
else
begin
Label1.Caption := 'Resolve OK.';
end;
end;
5. Dịch vụ tải tệp rest cần sửa hai phương pháp sau, đã gửi cho tác giả, đang chờ sửa đổi.
function TkbmMWHTTPMultiPart.GetAsBytes:TBytes;
var
p:PByte;
i:integer;
begin
SetLength(Result,FDataLength);
p:=PByte(FOwner.FStream.Memory);
inc(p,FDataOfs);
Move(p^,Result[0],FDataLength);
end;
function TkbmMWHTTPMultiPart.GetAsString:string;
begin
Result:=TkbmMWPlatformMarshal.UTF8Decode(GetData,FDataLength);
end;
Đây là ví dụ về dịch vụ tải tệp của xalion, phải học hỏi!
- Vấn đề với Scheduler
WaitRuns: Phương thức SameFile của FileService không đợi lấy CheckSum của tệp cục bộ, gây ra kết quả thực hiện sai, vấn đề này đã được giải quyết ở phiên bản 5.04.30, không biết tại sao lại quay lại, vấn đề nằm ở WaitRuns, không đợi Scheduler thực thi.
SynchronizedAfterRun: Sử dụng Scheduler thực hiện một truy vấn trong luồng, sau đó sử dụng tập dữ liệu trả về trong SynchronizedAfterRun, đôi khi gặp vấn đề không tìm thấy trường. Cảm giác có liên quan đến vấn đề của WaitRuns.
- Bạn Q Bảo Vũ phản hồi vấn đề Resolve KbmMW V5.06.2, sửa dữ liệu, kbmMWClientTransactionResolverTR.Resolve([kbmMWClientQueryMain]), khi lưu lại, thành câu lệnh insert, dẫn đến trùng khóa chính. KbmMW V5.06.1 beta đã phát hiện vấn đề này, quay lại phiên bản chính thức trước, hiện đã bình thường.